/*******************************************************************************
* Copyright (c) 2009, 2012 SpringSource, a divison of VMware, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SpringSource, a division of VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.virgo.ide.runtime.internal.core.command;
import java.io.IOException;
import java.util.Hashtable;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.eclipse.virgo.ide.runtime.core.IServerBehaviour;
import org.eclipse.virgo.ide.runtime.core.ServerCorePlugin;
import org.eclipse.virgo.ide.runtime.core.ServerUtils;
import org.eclipse.virgo.ide.runtime.internal.core.Server;
import org.eclipse.virgo.ide.runtime.internal.core.utils.StatusUtil;
/**
* @author Christian Dupuis
* @since 1.0.1
*/
public abstract class AbstractJmxServerCommand {
protected interface JmxServerCommandTemplate {
Object invokeOperation(MBeanServerConnection connection) throws Exception;
}
private static final String JMX_CONNECTOR_URL = "service:jmx:rmi:///jndi/rmi://%s:%d/jmxrmi"; //$NON-NLS-1$
protected final IServerBehaviour serverBehaviour;
public AbstractJmxServerCommand(IServerBehaviour serverBehaviour) {
this.serverBehaviour = serverBehaviour;
}
private JMXConnector getJmxConnector() throws IOException {
Hashtable<String, Object> h = new Hashtable<String, Object>();
Server server = ServerUtils.getServer(this.serverBehaviour);
if (this.serverBehaviour.getMBeanServerIp() == null) {
throw new IOException("MBean server not open for connection");
}
String connectorUrl = String.format(JMX_CONNECTOR_URL, this.serverBehaviour.getMBeanServerIp(), server.getMBeanServerPort());
return JMXConnectorFactory.connect(new JMXServiceURL(connectorUrl), h);
}
protected final Object execute(final JmxServerCommandTemplate template) throws TimeoutException {
Callable<Object> deployOperation = new Callable<Object>() {
public Object call() throws Exception {
JMXConnector connector = null;
try {
connector = getJmxConnector();
return template.invokeOperation(connector.getMBeanServerConnection());
} finally {
if (connector != null) {
try {
connector.close();
} catch (IOException e) {
StatusUtil.error(e);
}
}
}
}
};
FutureTask<Object> task = new FutureTask<Object>(deployOperation);
ServerCorePlugin.EXECUTOR.submit(task);
try {
return task.get(getTimeout(), TimeUnit.SECONDS);
} catch (InterruptedException e) {
// swallow exception here
} catch (ExecutionException e) {
// swallow exception here
}
return null;
}
/**
* @return the timeout of the operation in seconds
*/
protected int getTimeout() {
return 30;
}
}