001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.console.configcreator;
018
019 import java.io.ByteArrayOutputStream;
020 import java.io.File;
021 import java.io.IOException;
022 import java.net.URL;
023 import java.util.ArrayList;
024 import java.util.List;
025 import java.util.jar.JarFile;
026
027 import javax.enterprise.deploy.model.DDBean;
028 import javax.enterprise.deploy.model.DDBeanRoot;
029 import javax.enterprise.deploy.model.exceptions.DDBeanCreateException;
030 import javax.enterprise.deploy.shared.factories.DeploymentFactoryManager;
031 import javax.enterprise.deploy.spi.DeploymentConfiguration;
032 import javax.enterprise.deploy.spi.DeploymentManager;
033 import javax.enterprise.deploy.spi.Target;
034 import javax.enterprise.deploy.spi.exceptions.ConfigurationException;
035 import javax.enterprise.deploy.spi.exceptions.DeploymentManagerCreationException;
036 import javax.enterprise.deploy.spi.exceptions.InvalidModuleException;
037 import javax.enterprise.deploy.spi.factories.DeploymentFactory;
038 import javax.enterprise.deploy.spi.status.ProgressObject;
039 import javax.management.ObjectName;
040 import javax.portlet.PortletException;
041 import javax.portlet.PortletRequest;
042
043 import org.apache.geronimo.common.DeploymentException;
044 import org.apache.geronimo.connector.deployment.AdminObjectRefBuilder.AdminObjectRefProcessor;
045 import org.apache.geronimo.connector.deployment.ResourceRefBuilder.ResourceRefProcessor;
046 import org.apache.geronimo.console.configcreator.AbstractHandler.ReferenceData;
047 import org.apache.geronimo.console.configcreator.AbstractHandler.WARConfigData;
048 import org.apache.geronimo.console.configcreator.JSR77_Util.ReferredData;
049 import org.apache.geronimo.console.util.PortletManager;
050 import org.apache.geronimo.deployment.ConfigurationBuilder;
051 import org.apache.geronimo.deployment.ModuleIDBuilder;
052 import org.apache.geronimo.deployment.plugin.factories.DeploymentFactoryWithKernel;
053 import org.apache.geronimo.deployment.plugin.jmx.JMXDeploymentManager;
054 import org.apache.geronimo.deployment.service.jsr88.EnvironmentData;
055 import org.apache.geronimo.deployment.tools.loader.WebDeployable;
056 import org.apache.geronimo.j2ee.ApplicationInfo;
057 import org.apache.geronimo.j2ee.deployment.Module;
058 import org.apache.geronimo.j2ee.deployment.annotation.AnnotatedApp;
059 import org.apache.geronimo.j2ee.deployment.annotation.AnnotatedWebApp;
060 import org.apache.geronimo.j2ee.deployment.annotation.EJBAnnotationHelper;
061 import org.apache.geronimo.j2ee.deployment.annotation.HandlerChainAnnotationHelper;
062 import org.apache.geronimo.j2ee.deployment.annotation.PersistenceContextAnnotationHelper;
063 import org.apache.geronimo.j2ee.deployment.annotation.PersistenceUnitAnnotationHelper;
064 import org.apache.geronimo.j2ee.deployment.annotation.ResourceAnnotationHelper;
065 import org.apache.geronimo.j2ee.deployment.annotation.SecurityAnnotationHelper;
066 import org.apache.geronimo.j2ee.deployment.annotation.WebServiceRefAnnotationHelper;
067 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
068 import org.apache.geronimo.kernel.Kernel;
069 import org.apache.geronimo.kernel.config.ConfigurationManager;
070 import org.apache.geronimo.kernel.repository.Artifact;
071 import org.apache.geronimo.naming.deployment.EnvironmentEntryBuilder.EnvEntryRefProcessor;
072 import org.apache.geronimo.naming.deployment.SwitchingServiceRefBuilder.ServiceRefProcessor;
073 import org.apache.geronimo.naming.deployment.jsr88.EjbLocalRef;
074 import org.apache.geronimo.naming.deployment.jsr88.EjbRef;
075 import org.apache.geronimo.naming.deployment.jsr88.MessageDestination;
076 import org.apache.geronimo.naming.deployment.jsr88.Pattern;
077 import org.apache.geronimo.naming.deployment.jsr88.ResourceEnvRef;
078 import org.apache.geronimo.naming.deployment.jsr88.ResourceRef;
079 import org.apache.geronimo.web.deployment.WebAppDConfigBean;
080 import org.apache.geronimo.web.deployment.WebAppDConfigRoot;
081 import org.apache.geronimo.web25.deployment.AbstractWebModuleBuilder;
082 import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
083 import org.apache.geronimo.xbeans.geronimo.security.GerRoleType;
084 import org.apache.geronimo.xbeans.geronimo.security.GerSecurityType;
085 import org.apache.geronimo.xbeans.javaee.EjbLocalRefType;
086 import org.apache.geronimo.xbeans.javaee.EjbRefType;
087 import org.apache.geronimo.xbeans.javaee.MessageDestinationType;
088 import org.apache.geronimo.xbeans.javaee.ResourceEnvRefType;
089 import org.apache.geronimo.xbeans.javaee.ResourceRefType;
090 import org.apache.geronimo.xbeans.javaee.SecurityRoleType;
091 import org.apache.geronimo.xbeans.javaee.ServiceRefType;
092 import org.apache.geronimo.xbeans.javaee.WebAppType;
093 import org.apache.xbean.finder.ClassFinder;
094
095 /**
096 * Util class for JSR-88 related functions
097 *
098 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
099 */
100 public class JSR88_Util {
101
102 private static void parseAnnotations(AnnotatedApp annotatedApp, ClassFinder classFinder) throws Exception {
103 ResourceAnnotationHelper.processAnnotations(annotatedApp, classFinder, EnvEntryRefProcessor.INSTANCE);
104 WebServiceRefAnnotationHelper.processAnnotations(annotatedApp, classFinder);
105 HandlerChainAnnotationHelper.processAnnotations(annotatedApp, classFinder);
106 ResourceAnnotationHelper.processAnnotations(annotatedApp, classFinder, ServiceRefProcessor.INSTANCE);
107 ResourceAnnotationHelper.processAnnotations(annotatedApp, classFinder, AdminObjectRefProcessor.INSTANCE);
108 ResourceAnnotationHelper.processAnnotations(annotatedApp, classFinder, ResourceRefProcessor.INSTANCE);
109 PersistenceContextAnnotationHelper.processAnnotations(annotatedApp, classFinder);
110 PersistenceUnitAnnotationHelper.processAnnotations(annotatedApp, classFinder);
111 EJBAnnotationHelper.processAnnotations(annotatedApp, classFinder);
112 if (annotatedApp instanceof AnnotatedWebApp) {
113 SecurityAnnotationHelper.processAnnotations(((AnnotatedWebApp) annotatedApp).getWebApp(), classFinder);
114 }
115 }
116
117 private static ConfigurationBuilder getConfigurationBuilder(PortletRequest request) {
118 Object[] builders = PortletManager.getGBeansImplementing(request, ConfigurationBuilder.class);
119 ConfigurationBuilder configurationBuilder = null;
120 for (int i = 0; i < builders.length; i++) {
121 ObjectName objectName = PortletManager.getNameFor(request, builders[i]).getObjectName();
122 if ("EARBuilder".equalsIgnoreCase(objectName.getKeyProperty(NameFactory.J2EE_NAME))) {
123 configurationBuilder = (ConfigurationBuilder) builders[i];
124 break;
125 }
126 }
127 return configurationBuilder;
128 }
129
130 private static ApplicationInfo createApplicationInfo(PortletRequest request, URL moduleUrl) throws Exception {
131 ConfigurationBuilder configurationBuilderBuilder = getConfigurationBuilder(request);
132 File moduleFile = new File(moduleUrl.getFile());
133 JarFile moduleJar = new JarFile(moduleFile);
134 ApplicationInfo applicationInfo = (ApplicationInfo) configurationBuilderBuilder.getDeploymentPlan(null, moduleJar,
135 new ModuleIDBuilder());
136 return applicationInfo;
137 }
138
139 public static void parseWarReferences(PortletRequest request, WARConfigData data, URL warUrl)
140 throws Exception {
141 WebDeployable webDeployable = new WebDeployable(warUrl);
142 ClassLoader classLoader = webDeployable.getModuleLoader();
143
144 ApplicationInfo applicationInfo = createApplicationInfo(request, warUrl);
145 Module module = (Module) (applicationInfo.getModules().toArray()[0]);
146 WebAppType webApp = (WebAppType) module.getSpecDD();
147
148 ClassFinder classFinder = null;
149 try {
150 classFinder = AbstractWebModuleBuilder.createWebAppClassFinder(webApp, classLoader);
151 // classFinder = new ClassFinder(classLoader);
152 } catch (DeploymentException e1) {
153 // Some of the class types referred in the WAR cannot be resolved.
154 // A typical case would be references to EJBs already deployed into the system, and
155 // hence not packaged inside WEB-INF/lib directory of WAR.
156 // try adding all EJBs deployed in the system as parents of this WAR, and
157 // see if referred classes can now be successfully resolved
158
159 classLoader = new WebDeployable(warUrl, getEjbClassLoaders(request)).getModuleLoader();
160 try {
161 classFinder = AbstractWebModuleBuilder.createWebAppClassFinder(webApp, classLoader);
162 } catch (DeploymentException e2) {
163 throw e2;
164 }
165 }
166 AnnotatedApp annotatedApp = module.getAnnotatedApp();
167 parseAnnotations(annotatedApp, classFinder);
168
169 //DDBeanRoot ddBeanRoot = webDeployable.getDDBeanRoot();
170 //DDBean ddBean = ddBeanRoot.getChildBean("web-app")[0];
171
172 EjbRefType[] ejbRefs = annotatedApp.getEjbRefArray();
173 for (int i = 0; i < ejbRefs.length; i++) {
174 String refName = ejbRefs[i].getEjbRefName().getStringValue();
175 data.getEjbRefs().add(new ReferenceData(refName));
176 }
177 /*DDBean[] ddBeans = ddBean.getChildBean("ejb-ref");
178 for (int i = 0; ddBeans != null && i < ddBeans.length; i++) {
179 String refName = ddBeans[i].getChildBean("ejb-ref-name")[0].getText();
180 data.getEjbRefs().add(new ReferenceData(refName));
181 }*/
182
183 EjbLocalRefType[] ejbLocalRefs = annotatedApp.getEjbLocalRefArray();
184 for (int i = 0; i < ejbLocalRefs.length; i++) {
185 String refName = ejbLocalRefs[i].getEjbRefName().getStringValue();
186 data.getEjbLocalRefs().add(new ReferenceData(refName));
187 }
188 /*ddBeans = ddBean.getChildBean("ejb-local-ref");
189 for (int i = 0; ddBeans != null && i < ddBeans.length; i++) {
190 String refName = ddBeans[i].getChildBean("ejb-ref-name")[0].getText();
191 data.getEjbLocalRefs().add(new ReferenceData(refName));
192 }*/
193
194 ResourceRefType[] resourceRefs = annotatedApp.getResourceRefArray();
195 for(int i = 0; i < resourceRefs.length; i++) {
196 String refName = resourceRefs[i].getResRefName().getStringValue();
197 String refType = resourceRefs[i].getResType().getStringValue();
198 if ("javax.sql.DataSource".equalsIgnoreCase(refType)) {
199 data.getJdbcPoolRefs().add(new ReferenceData(refName));
200 } else if ("javax.jms.ConnectionFactory".equalsIgnoreCase(refType)
201 || "javax.jms.QueueConnectionFactory".equalsIgnoreCase(refType)
202 || "javax.jms.TopicConnectionFactory".equalsIgnoreCase(refType)) {
203 data.getJmsConnectionFactoryRefs().add(new ReferenceData(refName));
204 } else if ("javax.mail.Session".equalsIgnoreCase(refType)) {
205 data.getJavaMailSessionRefs().add(new ReferenceData(refName));
206 }
207 }
208 /*ddBeans = ddBean.getChildBean("resource-ref");
209 for (int i = 0; ddBeans != null && i < ddBeans.length; i++) {
210 String refName = ddBeans[i].getChildBean("res-ref-name")[0].getText();
211 String refType = ddBeans[i].getChildBean("res-type")[0].getText();
212 if ("javax.sql.DataSource".equalsIgnoreCase(refType)) {
213 data.getJdbcPoolRefs().add(new ReferenceData(refName));
214 } else if ("javax.jms.ConnectionFactory".equalsIgnoreCase(refType)
215 || "javax.jms.QueueConnectionFactory".equalsIgnoreCase(refType)
216 || "javax.jms.TopicConnectionFactory".equalsIgnoreCase(refType)) {
217 data.getJmsConnectionFactoryRefs().add(new ReferenceData(refName));
218 }
219 }*/
220
221 ServiceRefType[] serviceRefs = annotatedApp.getServiceRefArray();
222 for(int i = 0; i < serviceRefs.length; i++) {
223 String refName = serviceRefs[i].getServiceRefName().getStringValue();
224 GerServiceRefType serviceRef = GerServiceRefType.Factory.newInstance();
225 serviceRef.setServiceRefName(refName);
226 data.getWebServiceRefs().add(serviceRef);
227 }
228
229 ResourceEnvRefType[] resourceEnvRefs = annotatedApp.getResourceEnvRefArray();
230 for(int i = 0; i < resourceEnvRefs.length; i++) {
231 String refName = resourceEnvRefs[i].getResourceEnvRefName().getStringValue();
232 ReferenceData refData = new ReferenceData(refName);
233 refData.setRefLink(refName);
234 data.getJmsDestinationRefs().add(refData);
235 }
236 if(annotatedApp instanceof AnnotatedWebApp) {
237 WebAppType webApp2 = ((AnnotatedWebApp)annotatedApp).getWebApp();
238 MessageDestinationType[] messageDestinations = webApp2.getMessageDestinationArray();
239 for(int i = 0; i < messageDestinations.length; i++) {
240 String refName = messageDestinations[i].getMessageDestinationName().getStringValue();
241 ReferenceData refData = new ReferenceData(refName);
242 refData.setRefLink(refName);
243 data.getMessageDestinations().add(refData);
244 }
245
246 SecurityRoleType[] securityRoles = webApp2.getSecurityRoleArray();
247 if (securityRoles.length > 0) {
248 data.setSecurity(GerSecurityType.Factory.newInstance());
249 data.getSecurity().addNewRoleMappings();
250 }
251 for (int i = 0; i < securityRoles.length; i++) {
252 String roleName = securityRoles[i].getRoleName().getStringValue();
253 GerRoleType role = data.getSecurity().getRoleMappings().addNewRole();
254 role.setRoleName(roleName);
255 }
256 }
257 /*ddBeans = ddBean.getChildBean("message-destination");
258 for (int i = 0; ddBeans != null && i < ddBeans.length; i++) {
259 String refName = ddBeans[i].getChildBean("message-destination-name")[0].getText();
260 ReferenceData refData = new ReferenceData(refName);
261 refData.setRefLink(refName);
262 data.getJmsDestinationRefs().add(refData);
263 }*/
264 }
265
266 private static List getEjbClassLoaders(PortletRequest request) {
267 List deployedEjbs = JSR77_Util.getDeployedEJBs(request);
268 List configurations = new ArrayList();
269 for (int i = 0; i < deployedEjbs.size(); i++) {
270 String ejbPatternName = ((ReferredData) deployedEjbs.get(i)).getPatternName();
271 configurations.add(getDependencyString(ejbPatternName));
272 }
273 return getConfigClassLoaders(configurations);
274 }
275
276 private static List getConfigClassLoaders(List configurationNames) {
277 List classLoaders = new ArrayList();
278 ConfigurationManager configurationManager = PortletManager.getConfigurationManager();
279 for (int i = 0; i < configurationNames.size(); i++) {
280 Artifact configurationId = Artifact.create((String) configurationNames.get(i));
281 classLoaders.add(configurationManager.getConfiguration(configurationId).getConfigurationClassLoader());
282 }
283 return classLoaders;
284 }
285
286 public static String getDependencyString(String patternString) {
287 String[] elements = patternString.split("/", 6);
288 return elements[0] + "/" + elements[1] + "/" + elements[2] + "/" + elements[3];
289 }
290
291 public static String createDeploymentPlan(PortletRequest request, WARConfigData data, URL WarUrl)
292 throws IOException, DDBeanCreateException, InvalidModuleException, ConfigurationException, DeploymentManagerCreationException {
293 WebDeployable webDeployable = new WebDeployable(WarUrl);
294 DDBeanRoot ddBeanRoot = webDeployable.getDDBeanRoot();
295 DDBean ddBean = ddBeanRoot.getChildBean("web-app")[0];
296
297 Kernel kernel = PortletManager.getKernel();
298 DeploymentFactory factory = new DeploymentFactoryWithKernel(kernel);
299 DeploymentManager deploymentManager = factory.getDeploymentManager("deployer:geronimo:inVM", null, null);
300 DeploymentConfiguration deploymentConfiguration = deploymentManager.createConfiguration(webDeployable);
301 WebAppDConfigRoot configRoot = (WebAppDConfigRoot) deploymentConfiguration.getDConfigBeanRoot(ddBeanRoot);
302 WebAppDConfigBean webApp = (WebAppDConfigBean) configRoot.getDConfigBean(ddBean);
303
304 webApp.setContextRoot(data.getContextRoot());
305
306 EnvironmentData environment = new EnvironmentData();
307 webApp.setEnvironment(environment);
308 org.apache.geronimo.deployment.service.jsr88.Artifact configId = new org.apache.geronimo.deployment.service.jsr88.Artifact();
309 environment.setConfigId(configId);
310 configId.setGroupId(data.getGroupId());
311 configId.setArtifactId(data.getArtifactId());
312 configId.setVersion(data.getVersion());
313 configId.setType(data.getType());
314 int numDependencies = data.getDependencies().size();
315 if (numDependencies > 0) {
316 org.apache.geronimo.deployment.service.jsr88.Artifact[] dependencies = new org.apache.geronimo.deployment.service.jsr88.Artifact[numDependencies];
317 for (int i = 0; i < numDependencies; i++) {
318 dependencies[i] = new org.apache.geronimo.deployment.service.jsr88.Artifact();
319 }
320 environment.setDependencies(dependencies);
321 for (int i = 0; i < numDependencies; i++) {
322 Artifact artifact = Artifact.create(((String) data.getDependencies().get(i)).trim());
323 org.apache.geronimo.deployment.service.jsr88.Artifact dep = dependencies[i];
324 dep.setArtifactId(artifact.getArtifactId());
325 if (artifact.getGroupId() != null) {
326 dep.setGroupId(artifact.getGroupId());
327 }
328 if (artifact.getType() != null) {
329 dep.setType(artifact.getType());
330 }
331 if (artifact.getVersion() != null) {
332 dep.setVersion(artifact.getVersion().toString());
333 }
334 }
335 }
336 String hiddenClassesString = data.getHiddenClasses();
337 if (hiddenClassesString != null && hiddenClassesString.length() > 0) {
338 String[] hiddenClasses = getNonEmptyStrings(hiddenClassesString.split(";"));
339 if (hiddenClasses.length > 0) {
340 environment.setHiddenClasses(hiddenClasses);
341 }
342 }
343 String nonOverridableClassesString = data.getNonOverridableClasses();
344 if (nonOverridableClassesString != null && nonOverridableClassesString.length() > 0) {
345 String[] nonOverridableClasses = getNonEmptyStrings(nonOverridableClassesString.split(";"));
346 if (nonOverridableClasses.length > 0) {
347 environment.setNonOverridableClasses(nonOverridableClasses);
348 }
349 }
350 if (data.isInverseClassLoading()) {
351 environment.setInverseClassLoading(true);
352 }
353
354 int numEjbRefs = data.getEjbRefs().size();
355 if (numEjbRefs > 0) {
356 EjbRef[] ejbRefs = new EjbRef[numEjbRefs];
357 for (int i = 0; i < numEjbRefs; i++) {
358 ejbRefs[i] = new EjbRef();
359 }
360 webApp.setEjbRefs(ejbRefs);
361 for (int i = 0; i < numEjbRefs; i++) {
362 EjbRef ejbRef = ejbRefs[i];
363 ReferenceData referenceData = (ReferenceData) data.getEjbRefs().get(i);
364 ejbRef.setRefName(referenceData.getRefName());
365 ejbRef.setPattern(createPattern(referenceData.getRefLink()));
366 }
367 }
368
369 int numEjbLocalRefs = data.getEjbLocalRefs().size();
370 if (numEjbLocalRefs > 0) {
371 EjbLocalRef[] ejbLocalRefs = new EjbLocalRef[numEjbLocalRefs];
372 for (int i = 0; i < numEjbLocalRefs; i++) {
373 ejbLocalRefs[i] = new EjbLocalRef();
374 }
375 webApp.setEjbLocalRefs(ejbLocalRefs);
376 for (int i = 0; i < numEjbLocalRefs; i++) {
377 EjbLocalRef ejbLocalRef = ejbLocalRefs[i];
378 ReferenceData referenceData = (ReferenceData) data.getEjbLocalRefs().get(i);
379 ejbLocalRef.setRefName(referenceData.getRefName());
380 ejbLocalRef.setPattern(createPattern(referenceData.getRefLink()));
381 }
382 }
383
384 int numResourceRefs = data.getJdbcPoolRefs().size() + data.getJmsConnectionFactoryRefs().size()
385 + data.getJavaMailSessionRefs().size();
386 if (numResourceRefs > 0) {
387 ResourceRef[] resourceRefs = new ResourceRef[numResourceRefs];
388 for (int i = 0; i < numResourceRefs; i++) {
389 resourceRefs[i] = new ResourceRef();
390 }
391 webApp.setResourceRefs(resourceRefs);
392 int i = 0;
393 for (int l = 0; l < data.getJdbcPoolRefs().size(); l++, i++) {
394 ResourceRef resourceRef = resourceRefs[i];
395 ReferenceData referenceData = (ReferenceData) data.getJdbcPoolRefs().get(l);
396 resourceRef.setRefName(referenceData.getRefName());
397 resourceRef.setPattern(createPattern(referenceData.getRefLink()));
398 }
399 for (int m = 0; m < data.getJmsConnectionFactoryRefs().size(); m++, i++) {
400 ResourceRef resourceRef = resourceRefs[i];
401 ReferenceData referenceData = (ReferenceData) data.getJmsConnectionFactoryRefs().get(m);
402 resourceRef.setRefName(referenceData.getRefName());
403 resourceRef.setPattern(createPattern(referenceData.getRefLink()));
404 }
405 for (int n = 0; n < data.getJavaMailSessionRefs().size(); n++, i++) {
406 ResourceRef resourceRef = resourceRefs[i];
407 ReferenceData referenceData = (ReferenceData) data.getJavaMailSessionRefs().get(n);
408 resourceRef.setRefName(referenceData.getRefName());
409 resourceRef.setPattern(createPattern(referenceData.getRefLink()));
410 }
411 }
412
413 int numMessageDestinations = data.getMessageDestinations().size();
414 if (numMessageDestinations > 0) {
415 MessageDestination[] messageDestinations = new MessageDestination[numMessageDestinations];
416 for (int i = 0; i < numMessageDestinations; i++) {
417 messageDestinations[i] = new MessageDestination();
418 }
419 webApp.setMessageDestinations(messageDestinations);
420 for (int i = 0; i < numMessageDestinations; i++) {
421 MessageDestination messageDestination = messageDestinations[i];
422 ReferenceData referenceData = (ReferenceData) data.getMessageDestinations().get(i);
423 messageDestination.setMessageDestinationName(referenceData.getRefName());
424 // messageDestination.setPattern(createPattern(referenceData.getRefLink()));
425 messageDestination.setAdminObjectLink(createPattern(referenceData.getRefLink()).getName());
426 }
427 }
428
429 int numResourceEnvRefs = data.getJmsDestinationRefs().size();
430 if (numResourceEnvRefs > 0) {
431 ResourceEnvRef[] resourceEnvRefs = new ResourceEnvRef[numResourceEnvRefs];
432 for (int i = 0; i < numResourceEnvRefs; i++) {
433 resourceEnvRefs[i] = new ResourceEnvRef();
434 }
435 webApp.setResourceEnvRefs(resourceEnvRefs);
436 for (int i = 0; i < numResourceEnvRefs; i++) {
437 ResourceEnvRef resourceEnvRef = resourceEnvRefs[i];
438 ReferenceData referenceData = (ReferenceData) data.getJmsDestinationRefs().get(i);
439 resourceEnvRef.setRefName(referenceData.getRefName());
440 resourceEnvRef.setPattern(createPattern(referenceData.getRefLink()));
441 // resourceEnvRef.setAdminObjectLink(createPattern(referenceData.getRefLink()).getName());
442 }
443 }
444
445 int numWebServiceRefs = data.getWebServiceRefs().size();
446 if (numWebServiceRefs > 0) {
447 webApp.setServiceRefs(data.getWebServiceRefs().toArray(new GerServiceRefType[numWebServiceRefs]));
448 }
449
450 if (data.getSecurity() != null) {
451 webApp.setSecurityRealmName(data.getSecurityRealmName());
452 webApp.setSecurity(data.getSecurity());
453 }
454
455 ByteArrayOutputStream out = new ByteArrayOutputStream();
456 deploymentConfiguration.save(out);
457 out.close();
458 return new String(out.toByteArray(), "US-ASCII");
459 }
460
461 private static Pattern createPattern(String patternString) {
462 Pattern pattern = new Pattern();
463 String[] elements = patternString.split("/", 6);
464 pattern.setGroupId(elements[0]);
465 pattern.setArtifactId(elements[1]);
466 pattern.setVersion(elements[2]);
467 pattern.setType(elements[3]);
468 pattern.setModule(elements[4]);
469 pattern.setName(elements[5]);
470 return pattern;
471 }
472
473 private static String[] getNonEmptyStrings(String[] strings) {
474 ArrayList list = new ArrayList();
475 for (int i = 0; i < strings.length; i++) {
476 if (strings[i].trim().length() > 0)
477 list.add(strings[i].trim());
478 }
479 return (String[]) list.toArray(new String[list.size()]);
480 }
481
482 public static String[] deploy(PortletRequest actionRequest, File moduleFile, File planFile)
483 throws PortletException {
484 // TODO this is a duplicate of the code from
485 // org.apache.geronimo.console.configmanager.DeploymentPortlet.processAction()
486 // TODO need to eliminate this duplicate code
487 DeploymentFactoryManager dfm = DeploymentFactoryManager.getInstance();
488 String[] statusMsgs = new String[2];
489 try {
490 DeploymentManager mgr = dfm.getDeploymentManager("deployer:geronimo:inVM", null, null);
491 try {
492 if (mgr instanceof JMXDeploymentManager) {
493 ((JMXDeploymentManager) mgr).setLogConfiguration(false, true);
494 }
495
496 Target[] targets = mgr.getTargets();
497 if (null == targets) {
498 throw new IllegalStateException("No target to distribute to");
499 }
500 targets = new Target[] {targets[0]};
501
502 ProgressObject progress = mgr.distribute(targets, moduleFile, planFile);
503 while (progress.getDeploymentStatus().isRunning()) {
504 Thread.sleep(100);
505 }
506
507 String abbrStatusMessage;
508 String fullStatusMessage = null;
509 if (progress.getDeploymentStatus().isCompleted()) {
510 abbrStatusMessage = "The application was successfully deployed.<br/>";
511 // start installed app/s
512 progress = mgr.start(progress.getResultTargetModuleIDs());
513 while (progress.getDeploymentStatus().isRunning()) {
514 Thread.sleep(100);
515 }
516 abbrStatusMessage += "The application was successfully started";
517 } else {
518 fullStatusMessage = progress.getDeploymentStatus().getMessage();
519 // for the abbreviated status message clip off everything
520 // after the first line, which in most cases means the gnarly stacktrace
521 abbrStatusMessage = "Deployment failed:<br/>"
522 + fullStatusMessage.substring(0, fullStatusMessage.indexOf('\n'));
523 }
524 statusMsgs[0] = abbrStatusMessage;
525 statusMsgs[1] = fullStatusMessage;
526 } finally {
527 mgr.release();
528 }
529 } catch (Exception e) {
530 throw new PortletException(e);
531 }
532 return statusMsgs;
533 }
534 }