| /********************************************************************* |
| * 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; |
| } |
| } |