blob: b218045984bae16bced2dd7c2e0afbf7f3d49b5f [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.extender.internal.blueprint.activator.support;
import org.eclipse.gemini.blueprint.extender.support.internal.ConfigUtils;
import org.osgi.framework.Constants;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;
import static org.springframework.util.StringUtils.hasText;
/**
* RFC124-version of {@link ConfigUtils} class. Basically a small util class that handles the retrieval of relevant
* headers from the any given bundle.
*
* @author Costin Leau
*/
public class BlueprintConfigUtils {
private static final String EQUALS = "=";
private static final String SEMI_COLON = ";";
private static final String COMMA = ",";
/**
* Manifest entry name for configuring Blueprint modules
*/
public static final String BLUEPRINT_HEADER = "Bundle-Blueprint";
/**
* Standard wait for dependencies header
*/
public static final String BLUEPRINT_GRACE_PERIOD = "blueprint.graceperiod";
/**
* Standard timeout header
*/
public static final String BLUEPRINT_TIMEOUT = "blueprint.timeout";
public static final String EXTENDER_VERSION = "BlueprintExtender-Version";
/**
* Returns the {@value #BLUEPRINT_HEADER} if present from the given dictionary.
*/
public static String getBlueprintHeader(Dictionary headers) {
Object header = null;
if (headers != null)
header = headers.get(BLUEPRINT_HEADER);
return (header != null ? header.toString().trim() : null);
}
public static String getSymNameHeader(Dictionary headers) {
Object header = null;
if (headers != null)
header = headers.get(Constants.BUNDLE_SYMBOLICNAME);
return (header != null ? header.toString().trim() : null);
}
/**
* Shortcut method to retrieve directive values. Used internally by the dedicated getXXX.
*/
private static String getDirectiveValue(Dictionary headers, String directiveName) {
String header = getBlueprintHeader(headers);
if (header != null) {
String directive = ConfigUtils.getDirectiveValue(header, directiveName);
if (directive != null)
return directive;
}
return null;
}
/**
* Shortcut method for retrieving the directive values. Different then
* {@link #getDirectiveValue(Dictionary, String)} since it looks at the Bundle-Symbolic header and not at
* Spring-Context.
*/
private static String getBlueprintDirectiveValue(Dictionary headers, String directiveName) {
String header = getSymNameHeader(headers);
if (header != null) {
String directive = ConfigUtils.getDirectiveValue(header, directiveName);
if (directive != null)
return directive;
}
return null;
}
public static boolean hasTimeout(Dictionary headers) {
String header = getSymNameHeader(headers);
return header != null && hasText(ConfigUtils.getDirectiveValue(header, BLUEPRINT_TIMEOUT));
}
/**
* Shortcut for finding the boolean value for {@link #BLUEPRINT_TIMEOUT} directive using the given headers.
* <p>
* Assumes the headers belong to a Spring powered bundle. Returns the timeout (in milliseconds) for which the application
* context should wait to have its dependencies satisfied.
*/
public static long getTimeOut(Dictionary headers) {
String value = getBlueprintDirectiveValue(headers, BLUEPRINT_TIMEOUT);
if (value != null) {
if (ConfigUtils.DIRECTIVE_TIMEOUT_VALUE_NONE.equalsIgnoreCase(value)) {
return ConfigUtils.DIRECTIVE_NO_TIMEOUT;
}
return Long.valueOf(value);
}
return ConfigUtils.DIRECTIVE_TIMEOUT_DEFAULT * 1000;
}
/**
* Shortcut for finding the boolean value for {@link #BLUEPRINT_GRACE_PERIOD} directive using the given headers.
* Assumes the headers belong to a Spring powered bundle.
*/
public static boolean getWaitForDependencies(Dictionary headers) {
String value = getBlueprintDirectiveValue(headers, BLUEPRINT_GRACE_PERIOD);
return (value != null ? Boolean.valueOf(value) : ConfigUtils.DIRECTIVE_WAIT_FOR_DEPS_DEFAULT);
}
/**
* Shortcut for finding the boolean value for {@link ConfigUtils#DIRECTIVE_PUBLISH_CONTEXT} directive using the given headers.
* Assumes the headers belong to a Spring powered bundle.
*/
public static boolean getPublishContext(Dictionary headers) {
String value = getDirectiveValue(headers, ConfigUtils.DIRECTIVE_PUBLISH_CONTEXT);
return (value != null ? Boolean.valueOf(value) : ConfigUtils.DIRECTIVE_PUBLISH_CONTEXT_DEFAULT);
}
/**
* Shortcut for finding the boolean value for {@link ConfigUtils#DIRECTIVE_CREATE_ASYNCHRONOUSLY} directive using the given
* headers.
* <p>
* Assumes the headers belong to a Spring powered bundle.
*/
public static boolean getCreateAsync(Dictionary headers) {
String value = getDirectiveValue(headers, ConfigUtils.DIRECTIVE_CREATE_ASYNCHRONOUSLY);
return (value != null ? Boolean.valueOf(value)
: ConfigUtils.DIRECTIVE_CREATE_ASYNCHRONOUSLY_DEFAULT);
}
/**
* Returns the location headers (if any) specified by the Blueprint-Bundle header (if available). The returned
* Strings can be sent to a {@link org.springframework.core.io.ResourceLoader} for loading the configurations.
* <p>
* Different from {@link ConfigUtils#getSpringDmLocationsFromHeader(String)} since "," is used for separating
* clauses while ; is used inside a clause to allow parameters or directives besides paths.
* <p>
* Since the presence of the header, disables any processing this method will return null if the header is not
* specified, an empty array if it's empty (disabled) or a populated array otherwise.
*
* @param headers bundle headers
* @return array of locations specified (if any)
*/
public static String[] getBlueprintHeaderLocations(Dictionary headers) {
String header = getBlueprintHeader(headers);
// no header specified
if (header == null) {
return null;
}
// empty header specified
if (header.length() == 0) {
return new String[0];
}
List<String> ctxEntries = new ArrayList<>(4);
if (hasText(header)) {
String[] clauses = header.split(COMMA);
for (String clause : clauses) {
// split into directives
String[] directives = clause.split(SEMI_COLON);
if (!ObjectUtils.isEmpty(directives)) {
// check if it's a path or not
for (String directive : directives) {
if (!directive.contains(EQUALS)) {
ctxEntries.add(directive.trim());
}
}
}
}
}
return ctxEntries.toArray(new String[ctxEntries.size()]);
}
}