/**
*
* Copyright 2004, 2005 The Apache Software Foundation or its licensors, as applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.geronimo.console.jmsmanager.activemqCF;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.geronimo.common.DeploymentException;
import org.apache.geronimo.console.util.ObjectNameConstants;
import org.apache.geronimo.console.util.PortletManager;
import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.kernel.KernelRegistry;
import org.apache.geronimo.kernel.config.ConfigurationManager;
import org.apache.geronimo.kernel.config.ConfigurationUtil;
import org.apache.geronimo.kernel.repository.ListableRepository;
import javax.portlet.PortletRequest;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ActiveMQConnectorHelper {
//todo: this class is horrible and needs to be burned!
private final static Log log = LogFactory.getLog(ActiveMQConnectorHelper.class);
private static String MODULE_FILE;
private final static String ACTIVEMQ_RAR = "repository/activemq/rars/activemq-ra-3.2.1.rar";
private static final String LINE_SEP = System.getProperty("line.separator");
private static final String PLAN_TEMPLATE = getPlanTemplate();
private static final String[] DEPLOYER_ARGS = { File.class.getName(),
File.class.getName() };
private static final String DEPLOY_METHOD = "deploy";
private static String getPlanTemplate() {
StringBuffer sb = new StringBuffer();
sb.append("<?xml version=\"1.0\"?>\n");
sb
.append("<connector xmlns=\"http://geronimo.apache.org/xml/ns/j2ee/connector-1.0\"\n");
sb.append(" configId=\"{0}\" parentId=\"{1}\">\n");
sb.append(" <resourceadapter>\n");
sb.append(" <resourceadapter-instance>\n");
sb.append(" <resourceadapter-name>{2}</resourceadapter-name>\n");
sb
.append(" <config-property-setting name=\"ServerUrl\">{3}</config-property-setting>\n");
sb
.append(" <config-property-setting name=\"UserName\">{4}</config-property-setting>\n");
sb
.append(" <config-property-setting name=\"Password\">{5}</config-property-setting>\n");
sb
.append(" <workmanager><gbean-link>DefaultWorkManager</gbean-link></workmanager>\n");
sb.append(" </resourceadapter-instance>\n");
sb.append(" <outbound-resourceadapter>\n");
sb.append(" <connection-definition>\n");
sb
.append(" <connectionfactory-interface>javax.jms.ConnectionFactory</connectionfactory-interface>\n");
sb.append(" <connectiondefinition-instance>\n");
sb.append(" <name>{6}</name>\n");
sb
.append(" <implemented-interface>javax.jms.QueueConnectionFactory</implemented-interface>\n");
sb
.append(" <implemented-interface>javax.jms.TopicConnectionFactory</implemented-interface>\n");
sb.append(" <connectionmanager>\n");
sb.append(" <xa-transaction>\n");
sb.append(" <transaction-caching/>\n");
sb.append(" </xa-transaction>\n");
sb.append(" <single-pool>\n");
sb.append(" <max-size>{7}</max-size>\n");
sb
.append(" <blocking-timeout-milliseconds>{8}</blocking-timeout-milliseconds>\n");
sb.append(" <match-one/>\n");
sb.append(" </single-pool>\n");
sb.append(" </connectionmanager>\n");
sb.append(" </connectiondefinition-instance>\n");
sb.append(" </connection-definition>\n");
sb.append(" </outbound-resourceadapter>\n");
sb.append(" </resourceadapter>\n");
sb.append("</connector>\n");
return sb.toString();
}
private void savePlan(File f, Object[] args) {
MessageFormat mf = new MessageFormat(PLAN_TEMPLATE);
String plan = mf.format(args);
try {
f.createNewFile();
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter osw = new OutputStreamWriter(fos);
Writer out = new BufferedWriter(osw);
out.write(plan);
out.flush();
out.close();
osw.close();
fos.close();
} catch (Exception e) {
System.out.println("ERROR: Problem creating the plan file");
e.printStackTrace();
}
}
public void deployPlan(PortletRequest request, Object[] args) {
try {
File file = File.createTempFile("console-jms-connector-plan-", ".xml");
file.deleteOnExit();
savePlan(file, args);
if(MODULE_FILE == null) {
MODULE_FILE = PortletManager.getServerInfo(request).resolvePath(ACTIVEMQ_RAR);
}
deployPlan(new File(MODULE_FILE), file);
} catch (IOException e) {
log.error("Unable to write deployment plan", e);
}
}
public void deployPlan(File moduleFile, File planFile) {
try {
Kernel kernel = KernelRegistry.getSingleKernel();
List list = (List) kernel.invoke(ObjectNameConstants.DEPLOYER_OBJECT_NAME, DEPLOY_METHOD,
new Object[] {moduleFile, planFile}, DEPLOYER_ARGS);
ConfigurationManager configurationManager = ConfigurationUtil
.getConfigurationManager(kernel);
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
URI configID = URI.create((String)iterator.next());
if (!configurationManager.isLoaded(configID)) {
configurationManager.load(configID);
}
configurationManager.loadGBeans(configID);
configurationManager.start(configID);
}
} catch (DeploymentException e) {
StringBuffer buf = new StringBuffer(256);
Throwable cause = e;
while (cause != null) {
buf.append(cause.getMessage());
buf.append(LINE_SEP);
cause = cause.getCause();
}
System.out
.println("ERROR: Problem deploying the ActiveMQ connector: "
+ buf.toString());
e.printStackTrace();
} catch (URISyntaxException e) {
System.out
.println("ERROR: Newly installed app has invalid config ID");
e.printStackTrace();
} catch (Exception e) {
System.out.println("ERROR: Problem creating the datasource");
e.printStackTrace();
}
}
public List getDependencies(PortletRequest request) {
ListableRepository[] repo = PortletManager.getListableRepositories(request);
List dependencies = new ArrayList();
for (int i = 0; i < repo.length; i++) {
ListableRepository repository = repo[i];
try {
URI[] uris = repository.listURIs();
for (int j = 0; j < uris.length; j++) {
URI uri = uris[j];
dependencies.add(uri.toString());
}
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
return dependencies;
}
}