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 }