/*
|
* JBoss, Home of Professional Open Source
|
* Copyright 2005, JBoss Inc., and individual contributors as indicated
|
* by the @authors tag. See the copyright.txt in the distribution for a
|
* full listing of individual contributors.
|
*
|
* This is free software; you can redistribute it and/or modify it
|
* under the terms of the GNU Lesser General Public License as
|
* published by the Free Software Foundation; either version 2.1 of
|
* the License, or (at your option) any later version.
|
*
|
* This software is distributed in the hope that it will be useful,
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* Lesser General Public License for more details.
|
*
|
* You should have received a copy of the GNU Lesser General Public
|
* License along with this software; if not, write to the Free
|
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
*/
|
package org.jbpm.pvm.internal.cfg;
|
|
import java.io.File;
|
import java.io.InputStream;
|
import java.net.URL;
|
|
import javax.naming.InitialContext;
|
import javax.naming.NamingException;
|
|
import org.jbpm.api.Configuration;
|
import org.jbpm.api.ProcessEngine;
|
import org.jbpm.internal.log.Log;
|
import org.jbpm.pvm.internal.env.Context;
|
import org.jbpm.pvm.internal.processengine.ProcessEngineImpl;
|
import org.jbpm.pvm.internal.stream.FileStreamInput;
|
import org.jbpm.pvm.internal.stream.InputStreamInput;
|
import org.jbpm.pvm.internal.stream.ResourceStreamInput;
|
import org.jbpm.pvm.internal.stream.StreamInput;
|
import org.jbpm.pvm.internal.stream.StringStreamInput;
|
import org.jbpm.pvm.internal.stream.UrlStreamInput;
|
import org.jbpm.pvm.internal.wire.WireContext;
|
import org.jbpm.pvm.internal.wire.WireDefinition;
|
import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
|
|
|
/**
|
* @author Tom Baeyens
|
*/
|
public class ConfigurationImpl extends Configuration {
|
|
public static final String DEFAULT_CONFIG_RESOURCENAME = "jbpm.cfg.xml";
|
|
private static Log log = Log.getLog(ConfigurationImpl.class.getName());
|
|
transient protected boolean isConfigured = false;
|
transient String jndiName;
|
transient boolean checkDb = true;
|
transient boolean isSpringEnabled = false;
|
// type is Object because we don't want a dependency on spring in this class
|
transient Object applicationContext = null;
|
transient WireContext processEngineWireContext = new WireContext(new WireDefinition(), Context.CONTEXTNAME_PROCESS_ENGINE, true);
|
transient WireDefinition transactionWireDefinition = new WireDefinition();
|
transient ProcessEngine producedProcessEngine;
|
|
public ConfigurationImpl() {
|
// to prevent a loop in the constructors, we need to delegate to a non-default constructor in Configuration
|
super(null);
|
}
|
|
@Override
|
public ProcessEngine buildProcessEngine() {
|
if (!isConfigured) {
|
setResource(DEFAULT_CONFIG_RESOURCENAME);
|
}
|
if (jndiName!=null) {
|
try {
|
InitialContext initialContext = new InitialContext();
|
ProcessEngineImpl existing = (ProcessEngineImpl) initialContext.lookup(jndiName);
|
if (existing!=null) {
|
log.debug("found existing process engine under "+jndiName);
|
return existing;
|
}
|
} catch (NamingException e) {
|
log.debug("jndi name "+jndiName+" is not bound");
|
}
|
}
|
|
if (isSpringEnabled) {
|
// return SpringProcessEngine.create(this);
|
}
|
return new ProcessEngineImpl(this);
|
}
|
|
/**
|
* This method is called at the end of the buildProcessEngine() operation.
|
* Subclasses should override this method for custom ProcessEngine instantiation.
|
*/
|
protected ProcessEngine instantiateProcessEngine() {
|
return new ProcessEngineImpl(this);
|
}
|
|
public ConfigurationImpl setHibernateSessionFactory(Object hibernateSessionFactory) {
|
processEngineWireContext
|
.getWireDefinition()
|
.addDescriptor(new ProvidedObjectDescriptor(hibernateSessionFactory, true));
|
return this;
|
}
|
|
public ConfigurationImpl setInputStream(InputStream inputStream) {
|
parse(new InputStreamInput(inputStream));
|
return this;
|
}
|
|
public ConfigurationImpl setResource(String resource) {
|
parse(new ResourceStreamInput(resource, getClassLoader()));
|
return this;
|
}
|
|
public ConfigurationImpl setUrl(URL url) {
|
parse(new UrlStreamInput(url));
|
return this;
|
}
|
|
public ConfigurationImpl setFile(File file) {
|
parse(new FileStreamInput(file));
|
return this;
|
}
|
|
public ConfigurationImpl setXmlString(String xmlString) {
|
parse(new StringStreamInput(xmlString));
|
return this;
|
}
|
|
protected void parse(StreamInput streamSource) {
|
isConfigured = true;
|
ConfigurationParser.getInstance()
|
.createParse()
|
.contextStackPush(this)
|
.setStreamSource(streamSource)
|
.execute()
|
.checkErrors("jbpm configuration " + streamSource);
|
}
|
|
// fluent setters ///////////////////////////////////////////////////////////
|
|
public ConfigurationImpl skipDbCheck() {
|
checkDb = false;
|
return this;
|
}
|
|
public ConfigurationImpl jndiName(String jndiName) {
|
this.jndiName = jndiName;
|
return this;
|
}
|
|
public ConfigurationImpl springInitiated(Object applicationContext) {
|
this.isSpringEnabled = true;
|
this.applicationContext = applicationContext;
|
return this;
|
}
|
|
public ConfigurationImpl springEnabled() {
|
this.isSpringEnabled = true;
|
return this;
|
}
|
|
public ConfigurationImpl jndi(String jndiName) {
|
this.jndiName = jndiName;
|
return this;
|
}
|
|
public boolean isInstantiatedFromSpring() {
|
return (applicationContext!=null);
|
}
|
|
// getters and setters //////////////////////////////////////////////////////
|
|
public WireContext getProcessEngineWireContext() {
|
return processEngineWireContext;
|
}
|
public WireDefinition getTransactionWireDefinition() {
|
return transactionWireDefinition;
|
}
|
public String getJndiName() {
|
return jndiName;
|
}
|
public boolean isCheckDb() {
|
return checkDb;
|
}
|
public ProcessEngine getProducedProcessEngine() {
|
return producedProcessEngine;
|
}
|
public void setProducedProcessEngine(ProcessEngineImpl processEngine) {
|
this.producedProcessEngine = processEngine;
|
}
|
public Object getApplicationContext() {
|
return applicationContext;
|
}
|
}
|