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    
018    package org.apache.geronimo.console.jmsmanager.activemqCF;
019    
020    import org.apache.commons.logging.Log;
021    import org.apache.commons.logging.LogFactory;
022    import org.apache.geronimo.common.DeploymentException;
023    import org.apache.geronimo.console.util.ObjectNameConstants;
024    import org.apache.geronimo.console.util.PortletManager;
025    import org.apache.geronimo.kernel.Kernel;
026    import org.apache.geronimo.kernel.KernelRegistry;
027    import org.apache.geronimo.kernel.config.ConfigurationManager;
028    import org.apache.geronimo.kernel.config.ConfigurationUtil;
029    import org.apache.geronimo.kernel.repository.Artifact;
030    import org.apache.geronimo.kernel.repository.ListableRepository;
031    
032    import javax.portlet.PortletRequest;
033    import java.io.BufferedWriter;
034    import java.io.File;
035    import java.io.FileOutputStream;
036    import java.io.IOException;
037    import java.io.OutputStreamWriter;
038    import java.io.Writer;
039    import java.net.URISyntaxException;
040    import java.text.MessageFormat;
041    import java.util.ArrayList;
042    import java.util.Iterator;
043    import java.util.List;
044    import java.util.SortedSet;
045    
046    public class ActiveMQConnectorHelper {
047        //todo: this class is horrible and needs to be burned!
048        private final static Log log = LogFactory.getLog(ActiveMQConnectorHelper.class);
049    
050        private static String MODULE_FILE;
051    
052        private final static String ACTIVEMQ_RAR = "repository/activemq/rars/activemq-ra-3.2.1.rar";
053    
054        private static final String LINE_SEP = System.getProperty("line.separator");
055    
056        private static final String PLAN_TEMPLATE = getPlanTemplate();
057    
058        private static final String[] DEPLOYER_ARGS = { File.class.getName(),
059                File.class.getName() };
060    
061        private static final String DEPLOY_METHOD = "deploy";
062    
063        private static String getPlanTemplate() {
064            StringBuffer sb = new StringBuffer();
065            sb.append("<?xml version=\"1.0\"?>\n");
066            sb
067                    .append("<connector xmlns=\"http://geronimo.apache.org/xml/ns/j2ee/connector-1.0\"\n");
068            sb.append("    configId=\"{0}\" parentId=\"{1}\">\n");
069            sb.append("  <resourceadapter>\n");
070            sb.append("    <resourceadapter-instance>\n");
071            sb.append("      <resourceadapter-name>{2}</resourceadapter-name>\n");
072            sb
073                    .append("      <config-property-setting name=\"ServerUrl\">{3}</config-property-setting>\n");
074            sb
075                    .append("      <config-property-setting name=\"UserName\">{4}</config-property-setting>\n");
076            sb
077                    .append("      <config-property-setting name=\"Password\">{5}</config-property-setting>\n");
078            sb
079                    .append("      <workmanager><gbean-link>DefaultWorkManager</gbean-link></workmanager>\n");
080            sb.append("    </resourceadapter-instance>\n");
081            sb.append("    <outbound-resourceadapter>\n");
082            sb.append("      <connection-definition>\n");
083            sb
084                    .append("        <connectionfactory-interface>javax.jms.ConnectionFactory</connectionfactory-interface>\n");
085            sb.append("        <connectiondefinition-instance>\n");
086            sb.append("          <name>{6}</name>\n");
087            sb
088                    .append("          <implemented-interface>javax.jms.QueueConnectionFactory</implemented-interface>\n");
089            sb
090                    .append("          <implemented-interface>javax.jms.TopicConnectionFactory</implemented-interface>\n");
091            sb.append("          <connectionmanager>\n");
092            sb.append("            <xa-transaction>\n");
093            sb.append("              <transaction-caching/>\n");
094            sb.append("            </xa-transaction>\n");
095            sb.append("            <single-pool>\n");
096            sb.append("              <max-size>{7}</max-size>\n");
097            sb
098                    .append("              <blocking-timeout-milliseconds>{8}</blocking-timeout-milliseconds>\n");
099            sb.append("              <match-one/>\n");
100            sb.append("            </single-pool>\n");
101            sb.append("          </connectionmanager>\n");
102            sb.append("        </connectiondefinition-instance>\n");
103            sb.append("      </connection-definition>\n");
104            sb.append("    </outbound-resourceadapter>\n");
105            sb.append("  </resourceadapter>\n");
106            sb.append("</connector>\n");
107    
108            return sb.toString();
109        }
110    
111        private void savePlan(File f, Object[] args) {
112            MessageFormat mf = new MessageFormat(PLAN_TEMPLATE);
113            String plan = mf.format(args);
114    
115            try {
116                f.createNewFile();
117                FileOutputStream fos = new FileOutputStream(f);
118                OutputStreamWriter osw = new OutputStreamWriter(fos);
119                Writer out = new BufferedWriter(osw);
120                out.write(plan);
121                out.flush();
122                out.close();
123                osw.close();
124                fos.close();
125            } catch (Exception e) {
126                log.error("Problem creating the plan file", e);
127            }
128        }
129    
130        public void deployPlan(PortletRequest request, Object[] args) {
131            try {
132                File file = File.createTempFile("console-jms-connector-plan-", ".xml");
133                file.deleteOnExit();
134                savePlan(file, args);
135                if(MODULE_FILE == null) {
136                    MODULE_FILE = PortletManager.getCurrentServer(request).getServerInfo().resolvePath(ACTIVEMQ_RAR);
137                }
138                deployPlan(new File(MODULE_FILE), file);
139            } catch (IOException e) {
140                log.error("Unable to write deployment plan", e);
141            }
142        }
143    
144        public void deployPlan(File moduleFile, File planFile) {
145            try {
146                Kernel kernel = KernelRegistry.getSingleKernel();
147                List list = (List) kernel.invoke(ObjectNameConstants.DEPLOYER_OBJECT_NAME, DEPLOY_METHOD,
148                        new Object[] {moduleFile, planFile}, DEPLOYER_ARGS);
149                ConfigurationManager configurationManager = ConfigurationUtil
150                        .getConfigurationManager(kernel);
151                for (Iterator iterator = list.iterator(); iterator.hasNext();) {
152                    Artifact configID = Artifact.create((String)iterator.next());
153                    if (!configurationManager.isLoaded(configID)) {
154                        configurationManager.loadConfiguration(configID);
155                    }
156    
157                    configurationManager.startConfiguration(configID);
158                }
159            } catch (DeploymentException e) {
160                StringBuffer buf = new StringBuffer(256);
161                Throwable cause = e;
162                while (cause != null) {
163                    buf.append(cause.getMessage());
164                    buf.append(LINE_SEP);
165                    cause = cause.getCause();
166                }
167                log.error("Problem deploying the ActiveMQ connector: " + buf);
168            } catch (URISyntaxException e) {
169                log.error("Newly installed app has invalid config ID", e);
170            } catch (Exception e) {
171                log.error("Problem creating the datasource", e);
172            }
173        }
174    
175        public List getDependencies(PortletRequest request) {
176            ListableRepository[] repo = PortletManager.getCurrentServer(request).getRepositories();
177            List dependencies = new ArrayList();
178            for (int i = 0; i < repo.length; i++) {
179                ListableRepository repository = repo[i];
180                SortedSet artifacts = repository.list();
181                for (Iterator iterator = artifacts.iterator(); iterator.hasNext();) {
182                    Artifact artifact = (Artifact) iterator.next();
183                    dependencies.add(artifact.toString());
184                }
185            }
186    
187            return dependencies;
188        }
189    }