/******************************************************************************
* 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.support;
import java.util.Dictionary;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.framework.Bundle;
import org.eclipse.gemini.blueprint.extender.support.internal.ConfigUtils;
import org.eclipse.gemini.blueprint.extender.support.scanning.ConfigurationScanner;
import org.eclipse.gemini.blueprint.extender.support.scanning.DefaultConfigurationScanner;
import org.eclipse.gemini.blueprint.util.OsgiStringUtils;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
/**
* Configuration class for Spring-DM application contexts.
*
* Determines the configuration information available in a bundle for constructing an application context. Reads all the
* Spring-DM options present in the bundle header.
*
* @author Adrian Colyer
* @author Costin Leau
*/
public class ApplicationContextConfiguration {
/** logger */
private static final Log log = LogFactory.getLog(ApplicationContextConfiguration.class);
private final Bundle bundle;
private final ConfigurationScanner configurationScanner;
private final boolean asyncCreation;
private final String[] configurationLocations;
private final boolean isSpringPoweredBundle;
private final boolean publishContextAsService;
private final boolean waitForDeps;
private final String toString;
private final long timeout;
private final boolean hasTimeout;
/**
* Constructs a new <code>ApplicationContextConfiguration</code> instance from the given bundle. Uses the
* {@link DefaultConfigurationScanner} internally for discovering Spring-powered bundles.
*
* @param bundle bundle for which the application context configuration is created
*/
public ApplicationContextConfiguration(Bundle bundle) {
this(bundle, new DefaultConfigurationScanner());
}
public ApplicationContextConfiguration(Bundle bundle, ConfigurationScanner configurationScanner) {
Assert.notNull(bundle);
Assert.notNull(configurationScanner);
this.bundle = bundle;
this.configurationScanner = configurationScanner;
Dictionary headers = this.bundle.getHeaders();
String[] configs = this.configurationScanner.getConfigurations(bundle);
this.isSpringPoweredBundle = !ObjectUtils.isEmpty(configs);
this.configurationLocations = configs;
hasTimeout = ConfigUtils.isDirectiveDefined(headers, ConfigUtils.DIRECTIVE_TIMEOUT);
long option = ConfigUtils.getTimeOut(headers);
// translate into ms
this.timeout = (option >= 0 ? option * 1000 : option);
this.publishContextAsService = ConfigUtils.getPublishContext(headers);
this.asyncCreation = ConfigUtils.getCreateAsync(headers);
this.waitForDeps = ConfigUtils.getWaitForDependencies(headers);
// create toString
StringBuilder buf = new StringBuilder();
buf.append("AppCtxCfg [Bundle=");
buf.append(OsgiStringUtils.nullSafeSymbolicName(bundle));
buf.append("]isSpringBundle=");
buf.append(isSpringPoweredBundle());
buf.append("|async=");
buf.append(isCreateAsynchronously());
buf.append("|wait-for-deps=");
buf.append(isWaitForDependencies());
buf.append("|publishCtx=");
buf.append(isPublishContextAsService());
buf.append("|timeout=");
buf.append(getTimeout() / 1000);
buf.append("s");
toString = buf.toString();
if (log.isTraceEnabled()) {
log.trace("Configuration: " + toString);
}
}
/**
* Indicates if the given bundle is "Spring-Powered" or not.
*
* True if this bundle has at least one defined application context configuration file.
*
* <p/> A bundle is "Spring-Powered" if it has at least one configuration resource.
*/
public boolean isSpringPoweredBundle() {
return this.isSpringPoweredBundle;
}
public boolean isTimeoutDeclared() {
return hasTimeout;
}
/**
* Returns the timeout (in milliseconds) an application context needs to wait for mandatory dependent services.
*/
public long getTimeout() {
return this.timeout;
}
/**
* Indicates if an application context needs to be created asynchronously or not.
*
* Should the application context wait for all non-optional service references to be satisfied before starting?
*/
public boolean isCreateAsynchronously() {
return this.asyncCreation;
}
/**
* Indicates if the application context needs to be published as a service or not.
*
* @return Returns the publishContextAsService.
*/
public boolean isPublishContextAsService() {
return publishContextAsService;
}
/**
* Indicates if the configuration must wait for dependencies.
*
* @return true if the configuration indicates that dependencies should be waited for.
*/
public boolean isWaitForDependencies() {
return waitForDeps;
}
/**
* Returns the locations of the configuration resources used to build the application context (as Spring resource
* paths).
*
* @return configuration paths
*/
public String[] getConfigurationLocations() {
return this.configurationLocations;
}
public String toString() {
return toString;
}
}