/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.test.blueprint;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.main.MainSupport;
import org.osgi.framework.BundleContext;
/**
* A command line tool for booting up a CamelContext using an OSGi Blueprint XML file
*/
public class Main extends MainSupport {
protected static Main instance;
private BundleContext bundleContext;
private String descriptors = "OSGI-INF/blueprint/*.xml";
private CamelContext camelContext;
private String bundleName = "MyBundle";
private boolean includeSelfAsBundle;
private String configAdminPid;
private String configAdminFileName;
// ClassLoader used to scan for bundles in CamelBlueprintHelper.createBundleContext()
private ClassLoader loader;
public Main() {
addOption(new ParameterOption("ac", "applicationContext",
"Sets the classpath based OSGi Blueprint", "applicationContext") {
protected void doProcess(String arg, String parameter, LinkedList<String> remainingArgs) {
setDescriptors(parameter);
}
});
addOption(new ParameterOption("fa", "fileApplicationContext",
"Sets the filesystem based OSGi Blueprint", "fileApplicationContext") {
protected void doProcess(String arg, String parameter, LinkedList<String> remainingArgs) {
setDescriptors(parameter);
}
});
addOption(new ParameterOption("pid", "configAdminPid",
"Sets the ConfigAdmin persistentId", "configAdminPid") {
protected void doProcess(String arg, String parameter, LinkedList<String> remainingArgs) {
setConfigAdminPid(parameter);
}
});
addOption(new ParameterOption("pf", "configAdminFileName",
"Sets the ConfigAdmin persistent file name", "configAdminFileName") {
protected void doProcess(String arg, String parameter, LinkedList<String> remainingArgs) {
setConfigAdminFileName(parameter);
}
});
}
public static void main(String... args) throws Exception {
Main main = new Main();
main.run(args);
}
/**
* Returns the currently executing main
*
* @return the current running instance
*/
public static Main getInstance() {
return instance;
}
@Override
protected void doStart() throws Exception {
super.doStart();
if (bundleContext == null) {
String descriptors = getDescriptors();
if (descriptors == null) {
throw new IllegalArgumentException("Descriptors must be provided, with the name of the blueprint XML file");
}
LOG.debug("Starting Blueprint XML file: " + descriptors);
if (configAdminPid != null && configAdminFileName != null) {
// pid/file is used to set INITIAL content of ConfigAdmin to be used when blueprint container is started
bundleContext = createBundleContext(bundleName, new String[] {configAdminFileName, configAdminPid});
} else {
bundleContext = createBundleContext(bundleName);
}
Set<Long> eventHistory = new HashSet<>();
camelContext = CamelBlueprintHelper.getOsgiService(bundleContext, CamelContext.class);
if (camelContext == null) {
throw new IllegalArgumentException("Cannot find CamelContext in blueprint XML file: " + descriptors);
}
}
}
@Override
protected void doStop() throws Exception {
// stop camel context
if (camelContext != null) {
camelContext.stop();
}
// and then stop blueprint
LOG.debug("Stopping Blueprint XML file: " + descriptors);
CamelBlueprintHelper.disposeBundleContext(bundleContext);
// call completed to properly stop as we count down the waiting latch
completed();
}
@Override
protected ProducerTemplate findOrCreateCamelTemplate() {
if (camelContext != null) {
return camelContext.createProducerTemplate();
} else {
return null;
}
}
protected BundleContext createBundleContext() throws Exception {
return createBundleContext(getClass().getSimpleName());
}
protected BundleContext createBundleContext(String name, String[]... configAdminPidFiles) throws Exception {
return createBundleContext(name, loader, configAdminPidFiles);
}
protected BundleContext createBundleContext(String name, ClassLoader loader, String[]... configAdminPidFiles) throws Exception {
return CamelBlueprintHelper.createBundleContext(name, descriptors, isIncludeSelfAsBundle(),
CamelBlueprintHelper.BUNDLE_FILTER, CamelBlueprintHelper.BUNDLE_VERSION, null,
loader, configAdminPidFiles);
}
@Override
protected Map<String, CamelContext> getCamelContextMap() {
Map<String, CamelContext> map = new HashMap<String, CamelContext>(1);
if (camelContext != null) {
map.put(camelContext.getName(), camelContext);
}
return map;
}
public String getDescriptors() {
return descriptors;
}
public void setDescriptors(String descriptors) {
this.descriptors = descriptors;
}
public String getBundleName() {
return bundleName;
}
public void setBundleName(String bundleName) {
this.bundleName = bundleName;
}
public boolean isIncludeSelfAsBundle() {
return includeSelfAsBundle;
}
public void setIncludeSelfAsBundle(boolean includeSelfAsBundle) {
this.includeSelfAsBundle = includeSelfAsBundle;
}
public String getConfigAdminPid() {
return configAdminPid;
}
public void setConfigAdminPid(String pid) {
this.configAdminPid = pid;
}
public String getConfigAdminFileName() {
return configAdminFileName;
}
public void setConfigAdminFileName(String fileName) {
this.configAdminFileName = fileName;
}
public void setLoader(ClassLoader loader) {
this.loader = loader;
}
}