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    }