blob: ec5bba1f37c4378564362c78259b1ed4d12ab7d2 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2009, 2012 SpringSource, a division of VMware, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.virgo.ide.runtime.internal.core.command;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.concurrent.TimeoutException;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import org.eclipse.core.runtime.IPath;
import org.eclipse.virgo.ide.runtime.core.IServerBehaviour;
import org.eclipse.virgo.ide.runtime.internal.core.utils.StatusUtil;
import org.eclipse.wst.server.core.IModule;
/**
* Base implementation that encapsulates the communication with a JMX MBean.
*
* @author Christian Dupuis
* @since 1.0.1
*/
public abstract class AbstractJmxServerDeployerCommand<T> extends AbstractJmxServerCommand {
private static final String FILE_SCHEME = "file";
protected final IModule module;
/**
* Creates a new {@link AbstractJmxServerDeployerCommand}.
*/
public AbstractJmxServerDeployerCommand(IServerBehaviour serverBehaviour, IModule module) {
super(serverBehaviour);
this.module = module;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
StringBuilder builder = new StringBuilder("[");
builder.append(getClass().getSimpleName()).append(" -> ").append(getMBeanName()).append(".").append(getOperationName()).append("(").append(
Arrays.deepToString(getOperationArguments())).append(")").append("]");
return builder.toString();
}
/**
* Method to be called by sub-classes to execute given command against the MBean
*/
@SuppressWarnings("unchecked")
protected final T doExecute() throws IOException, TimeoutException {
JmxServerCommandTemplate template = new JmxServerCommandTemplate() {
public Object invokeOperation(MBeanServerConnection connection) throws Exception {
ObjectName name = ObjectName.getInstance(getMBeanName());
Object[] operationArguments = getOperationArguments();
String[] classNames = new String[operationArguments.length];
for (int i = 0; i < operationArguments.length; i++) {
if (operationArguments[i] instanceof Boolean) {
classNames[i] = boolean.class.getName();
} else {
classNames[i] = operationArguments[i].getClass().getName();
}
}
return connection.invoke(name, getOperationName(), operationArguments, classNames);
}
};
return (T) execute(template);
}
/**
* Returns the name of the MBean to connect to.
*/
protected String getMBeanName() {
return this.serverBehaviour.getVersionHandler().getDeployerMBeanName();
}
/**
* Returns the arguments of the MBean operation.
*/
protected abstract Object[] getOperationArguments();
/**
* Returns the name of the MBean operation.
*/
protected abstract String getOperationName();
/**
* Create a {@link URI} from the given <code>path</code>.
*/
static final URI getUri(IPath path) {
// we can't use path.toFile().toURI() as this will use OS specific paths
// and will fail
// miserable if you run for VMware
try {
if (path.toString().startsWith("/")) {
return new URI(FILE_SCHEME, path.toString(), null);
} else {
return new URI(FILE_SCHEME, "/" + path.toString(), null);
}
} catch (URISyntaxException e) {
StatusUtil.error(e);
}
return null;
}
}