public void addGBeans(EARContext earContext, Module module, ClassLoader earClassLoader) throws DeploymentException {
J2eeContext earJ2eeContext = earContext.getJ2eeContext();
AppClientModule appClientModule = (AppClientModule) module;
ApplicationClientType appClient = (ApplicationClientType) appClientModule.getSpecDD();
GerApplicationClientType geronimoAppClient = (GerApplicationClientType) appClientModule.getVendorDD();
// get the app client main class
JarFile moduleFile = module.getModuleFile();
String mainClasss = null;
// String classPath = null;
try {
Manifest manifest = moduleFile.getManifest();
if (manifest == null) {
throw new DeploymentException("App client module jar does not contain a manifest: " + moduleFile.getName());
}
mainClasss = manifest.getMainAttributes().getValue(Attributes.Name.MAIN_CLASS);
if (mainClasss == null) {
throw new DeploymentException("App client module jar does not have Main-Class defined in the manifest: " + moduleFile.getName());
}
String classPath = manifest.getMainAttributes().getValue(Attributes.Name.CLASS_PATH);
if (module.isStandAlone() && classPath != null) {
throw new DeploymentException("Manifest class path entry is not allowed in a standalone jar (J2EE 1.4 Section 8.2)");
}
} catch (IOException e) {
throw new DeploymentException("Could not get manifest from app client module: " + moduleFile.getName());
}
// generate the object name for the app client
ObjectName appClientModuleName = null;
try {
//TODO consider constructing a module context
appClientModuleName = NameFactory.getModuleName(null, null, null, NameFactory.APP_CLIENT_MODULE, appClientModule.getName(), earJ2eeContext);
} catch (MalformedObjectNameException e) {
throw new DeploymentException("Could not construct module name", e);
}
// create a gbean for the app client module and add it to the ear
Map componentContext;
GBeanData appClientModuleGBeanData = new GBeanData(appClientModuleName, J2EEAppClientModuleImpl.GBEAN_INFO);
try {
appClientModuleGBeanData.setReferencePatterns("J2EEServer", Collections.singleton(earContext.getServerObjectName()));
if (!earContext.getJ2EEApplicationName().equals("null")) {
appClientModuleGBeanData.setReferencePatterns("J2EEApplication", Collections.singleton(earContext.getApplicationObjectName()));
}
appClientModuleGBeanData.setAttribute("deploymentDescriptor", appClientModule.getOriginalSpecDD());
} catch (Exception e) {
throw new DeploymentException("Unable to initialize AppClientModule GBean", e);
}
earContext.addGBean(appClientModuleGBeanData);
// create another child configuration within the config store for the client application
EARContext appClientDeploymentContext = null;
File appClientDir = null;
ConfigurationData appClientConfigurationData = null;
try {
try {
appClientDir = 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());
List clientParentId = ServiceConfigBuilder.getParentID(geronimoAppClient.getClientParentId(), geronimoAppClient.getImportArray());
clientParentId.addAll(defaultClientParentId);
appClientDeploymentContext = new EARContext(appClientDir,
clientConfigId,
ConfigurationModuleType.CAR,
clientParentId,
kernel,
clientApplicationName,
transactionContextManagerObjectName,
connectionTrackerObjectName,
null,
null,
corbaGBeanObjectName,
RefContext.derivedClientRefContext(earContext.getRefContext(), ejbReferenceBuilder, resourceReferenceBuilder, serviceReferenceBuilder));
} catch (Exception e) {
throw new DeploymentException("Could not create a deployment context for the app client", e);
}
//register the message destinations in the app client ear context.
MessageDestinationType[] messageDestinations = appClient.getMessageDestinationArray();
GerMessageDestinationType[] gerMessageDestinations = geronimoAppClient.getMessageDestinationArray();
ENCConfigBuilder.registerMessageDestinations(appClientDeploymentContext.getRefContext(), appClientModule.getName(), messageDestinations, gerMessageDestinations);
// 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
DependencyType[] includes = geronimoAppClient.getIncludeArray();
ServiceConfigBuilder.addIncludes(appClientDeploymentContext, includes, repository);
// add the dependencies
DependencyType[] dependencies = geronimoAppClient.getDependencyArray();
ServiceConfigBuilder.addDependencies(appClientDeploymentContext, dependencies, repository);
// 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) {
GbeanType[] gbeans = geronimoAppClient.getGbeanArray();
ServiceConfigBuilder.addGBeans(gbeans, appClientClassLoader, appClientDeploymentContext.getJ2eeContext(), 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().trim();
URI pathURI = null;
try {
pathURI = new URI(path);
} catch (URISyntaxException e) {
throw new DeploymentException("Bad path to external rar", e);
}
if (!repository.hasURI(pathURI)) {
throw new DeploymentException("Missing rar in repository: " + path);
}
URL pathURL = null;
try {
pathURL = repository.getURL(pathURI);
} catch (MalformedURLException e) {
throw new DeploymentException("Could not locate external rar in repository", e);
}
try {
connectorFile = new JarFile(pathURL.getFile());
} catch (IOException e) {
throw new DeploymentException("Could not access rar contents", e);
}
} else {
path = resource.getInternalRar();
try {
connectorFile = new NestedJarFile(appClientModule.getEarFile(), path);
} catch (IOException e) {
throw new DeploymentException("Could not locate connector inside ear", e);
}
}
XmlObject connectorPlan = resource.getConnector();
Module connectorModule = connectorModuleBuilder.createModule(connectorPlan, connectorFile, path, null, null, null);
resourceModules.add(connectorModule);
connectorModuleBuilder.installModule(connectorFile, appClientDeploymentContext, connectorModule);
}
//the install step could have added more dependencies... we need a new cl.
appClientClassLoader = appClientDeploymentContext.getClassLoader(repository);
for (Iterator iterator = resourceModules.iterator(); iterator.hasNext();) {
Module connectorModule = (Module) iterator.next();
connectorModuleBuilder.initContext(appClientDeploymentContext, connectorModule, appClientClassLoader);
}
for (Iterator iterator = resourceModules.iterator(); iterator.hasNext();) {
Module connectorModule = (Module) iterator.next();
connectorModuleBuilder.addGBeans(appClientDeploymentContext, connectorModule, appClientClassLoader);
}
} 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");
GBeanData jndiContextGBeanData = new GBeanData(jndiContextName, StaticJndiContextPlugin.GBEAN_INFO);
try {
componentContext = buildComponentContext(appClientDeploymentContext, earContext, appClientModule, appClient, geronimoAppClient, appClientClassLoader);
jndiContextGBeanData.setAttribute("context", componentContext);
} catch (DeploymentException e) {
throw e;
} catch (Exception e) {
throw new DeploymentException("Unable to construct jndi context for AppClientModule GBean", e);
}
appClientDeploymentContext.addGBean(jndiContextGBeanData);
// finally add the app client container
ObjectName appClientContainerName = ObjectName.getInstance("geronimo.client:type=ClientContainer");
GBeanData appClientContainerGBeanData = new GBeanData(appClientContainerName, AppClientContainer.GBEAN_INFO);
try {
appClientContainerGBeanData.setAttribute("mainClassName", mainClasss);
appClientContainerGBeanData.setAttribute("appClientModuleName", appClientModuleName);
String callbackHandlerClassName = null;
if (appClient.isSetCallbackHandler()) {
callbackHandlerClassName = appClient.getCallbackHandler().getStringValue().trim();
}
if (geronimoAppClient.isSetCallbackHandler()) {
callbackHandlerClassName = geronimoAppClient.getCallbackHandler().trim();
}
String realmName = null;