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 }