throw new DeploymentException("Could not construct module name", e);
}
// create a gbean for the app client module and add it to the ear
ReadOnlyContext componentContext;
GBeanMBean appClientModuleGBean = new GBeanMBean(J2EEAppClientModuleImpl.GBEAN_INFO, earClassLoader);
try {
appClientModuleGBean.setReferencePatterns("J2EEServer", Collections.singleton(earContext.getServerObjectName()));
if (!earContext.getJ2EEApplicationName().equals("null")) {
appClientModuleGBean.setReferencePatterns("J2EEApplication", Collections.singleton(earContext.getApplicationObjectName()));
}
appClientModuleGBean.setAttribute("deploymentDescriptor", null);
componentContext = buildComponentContext(earContext, appClientModule, appClient, geronimoAppClient, earClassLoader);
appClientModuleGBean.setAttribute("componentContext", componentContext);
} catch (Exception e) {
throw new DeploymentException("Unable to initialize AppClientModule GBean", e);
}
earContext.addGBean(appClientModuleName, appClientModuleGBean);
// create another child configuration within the config store for the client application
EARContext appClientDeploymentContext = null;
File appClientConfiguration = null;
try {
try {
appClientConfiguration = store.createNewConfigurationDir();
// construct the app client deployment context... this is the same class used by the ear context
try {
URI clientConfigId = URI.create(geronimoAppClient.getClientConfigId());
URI clientParentId;
if (geronimoAppClient.isSetClientParentId()) {
clientParentId = URI.create(geronimoAppClient.getClientParentId());
} else {
clientParentId = defaultClientParentId;
}
appClientDeploymentContext = new EARContext(appClientConfiguration,
clientConfigId,
ConfigurationModuleType.APP_CLIENT,
clientParentId,
kernel,
clientDomainName,
clientServerName,
clientApplicationName,
transactionContextManagerObjectName,
connectionTrackerObjectName,
null,
null,
RefContext.derivedClientRefContext(earContext.getRefContext(), ejbReferenceBuilder, resourceReferenceBuilder));
} catch (Exception e) {
throw new DeploymentException("Could not create a deployment context for the app client", e);
}
// extract the client Jar file into a standalone packed jar file and add the contents to the output
URI moduleBase = new URI(appClientModule.getTargetPath());
try {
appClientDeploymentContext.addIncludeAsPackedJar(moduleBase, moduleFile);
} catch (IOException e) {
throw new DeploymentException("Unable to copy app client module jar into configuration: " + moduleFile.getName());
}
// add the includes
GerDependencyType[] includes = geronimoAppClient.getIncludeArray();
for (int i = 0; i < includes.length; i++) {
GerDependencyType include = includes[i];
URI uri = getDependencyURI(include);
String name = uri.toString();
int idx = name.lastIndexOf('/');
if (idx != -1) {
name = name.substring(idx + 1);
}
URI path;
try {
path = new URI(name);
} catch (URISyntaxException e) {
throw new DeploymentException("Unable to generate path for include: " + uri, e);
}
try {
URL url = repository.getURL(uri);
appClientDeploymentContext.addInclude(path, url);
} catch (IOException e) {
throw new DeploymentException("Unable to add include: " + uri, e);
}
}
// add the dependencies
GerDependencyType[] dependencies = geronimoAppClient.getDependencyArray();
for (int i = 0; i < dependencies.length; i++) {
appClientDeploymentContext.addDependency(getDependencyURI(dependencies[i]));
}
// add manifest class path entries to the app client context
addManifestClassPath(appClientDeploymentContext, appClientModule.getEarFile(), moduleFile, moduleBase);
// get the classloader
ClassLoader appClientClassLoader = appClientDeploymentContext.getClassLoader(repository);
// pop in all the gbeans declared in the geronimo app client file
if (geronimoAppClient != null) {
GerGbeanType[] gbeans = geronimoAppClient.getGbeanArray();
for (int i = 0; i < gbeans.length; i++) {
GBeanHelper.addGbean(new AppClientGBeanAdapter(gbeans[i]), appClientClassLoader, appClientDeploymentContext);
}
//deploy the resource adapters specified in the geronimo-application.xml
Collection resourceModules = new ArrayList();
try {
GerResourceType[] resources = geronimoAppClient.getResourceArray();
for (int i = 0; i < resources.length; i++) {
GerResourceType resource = resources[i];
String path;
JarFile connectorFile;
if (resource.isSetExternalRar()) {
path = resource.getExternalRar();
URI pathURI = new URI(path);
if (!repository.hasURI(pathURI)) {
throw new DeploymentException("Missing rar in repository: " + path);
}
URL pathURL = repository.getURL(pathURI);
connectorFile = new JarFile(pathURL.getFile());
} else {
path = resource.getInternalRar();
connectorFile = new NestedJarFile(appClientModule.getEarFile(), path);
}
XmlObject connectorPlan = resource.getConnector();
Module connectorModule = connectorModuleBuilder.createModule(connectorPlan, connectorFile, path, null, null);
resourceModules.add(connectorModule);
connectorModuleBuilder.installModule(connectorFile, appClientDeploymentContext, connectorModule);
}
ClassLoader cl = appClientDeploymentContext.getClassLoader(repository);
for (Iterator iterator = resourceModules.iterator(); iterator.hasNext();) {
Module connectorModule = (Module) iterator.next();
connectorModuleBuilder.initContext(appClientDeploymentContext, connectorModule, cl);
}
for (Iterator iterator = resourceModules.iterator(); iterator.hasNext();) {
Module connectorModule = (Module) iterator.next();
connectorModuleBuilder.addGBeans(appClientDeploymentContext, connectorModule, cl);
}
} finally {
for (Iterator iterator = resourceModules.iterator(); iterator.hasNext();) {
Module connectorModule = (Module) iterator.next();
connectorModule.close();
}
}
}
// add the app client static jndi provider
ObjectName jndiContextName = ObjectName.getInstance("geronimo.client:type=StaticJndiContext");
GBeanMBean jndiContextGBean = new GBeanMBean("org.apache.geronimo.client.StaticJndiContextPlugin", appClientClassLoader);
try {
componentContext = buildComponentContext(appClientDeploymentContext, appClientModule, appClient, geronimoAppClient, earClassLoader);
jndiContextGBean.setAttribute("context", componentContext);
} catch (Exception e) {
throw new DeploymentException("Unable to initialize AppClientModule GBean", e);
}
appClientDeploymentContext.addGBean(jndiContextName, jndiContextGBean);
// finally add the app client container
ObjectName appClienContainerName = ObjectName.getInstance("geronimo.client:type=ClientContainer");
GBeanMBean appClienContainerGBean = new GBeanMBean("org.apache.geronimo.client.AppClientContainer", appClientClassLoader);
try {
appClienContainerGBean.setAttribute("mainClassName", mainClasss);
appClienContainerGBean.setAttribute("appClientModuleName", appClientModuleName);
appClienContainerGBean.setReferencePattern("JNDIContext", new ObjectName("geronimo.client:type=StaticJndiContext"));
appClienContainerGBean.setReferencePattern("TransactionContextManager", new ObjectName("geronimo.client:type=TransactionContextManager"));
} catch (Exception e) {
throw new DeploymentException("Unable to initialize AppClientModule GBean", e);
}
appClientDeploymentContext.addGBean(appClienContainerName, appClienContainerGBean);
} finally {