![JAR search and dependency download from the Maven repository](/logo.png)
org.glassfish.deployment.client.RemoteDeploymentFacility Maven / Gradle / Ivy
/*
* Copyright (c) 2008, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.glassfish.deployment.client;
import com.sun.enterprise.admin.cli.ProgramOptions;
import com.sun.enterprise.admin.cli.Environment;
import com.sun.enterprise.admin.cli.remote.RemoteCommand;
import org.glassfish.api.admin.CommandException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.Properties;
/**
* Implements DeploymentFacility, currently using the RemoteCommand to work with the
* admin back-end.
*
* Because RemoteCommand uses the http interface with the admin back-end it
* is connectionless. Clients of RemoteDeploymentFacility must still invoke
* {@link #connect} before attempting to use the DF.
*
* @author tjquinn
*/
public class RemoteDeploymentFacility extends AbstractDeploymentFacility {
@Override
protected boolean doConnect() {
return true;
}
@Override
public boolean doDisconnect() {
return true;
}
@Override
protected DFCommandRunner getDFCommandRunner(
String commandName,
Map commandOptions,
String[] operands) throws CommandException {
return new RemoteCommandRunner(commandName, commandOptions, operands);
}
private class RemoteCommandRunner implements DFCommandRunner {
private final String commandName;
private final Map commandOptions;
private final String[] operands;
private RemoteCommandRunner(
String commandName,
Map commandOptions,
String[] operands) {
this.commandOptions = commandOptions;
this.commandName = commandName;
this.operands = operands;
}
public DFDeploymentStatus run() throws CommandException {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
String[] commandArgs = prepareRemoteCommandArguments(
commandName,
commandOptions,
operands
);
Environment env = new Environment();
ProgramOptions po = prepareRemoteCommandProgramOptions(env);
RemoteCommand rc =
new RemoteCommand(commandName, po, env, "jsr-88/xml", baos);
rc.executeAndReturnOutput(commandArgs);
DFDeploymentStatus status = CommandXMLResultParser.parse(new ByteArrayInputStream(baos.toByteArray()));
return status;
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
/**
* Assembles an argument list suitable for use by RemoteCommand from the
* command, options, and operand.
* @param commandName the command to execute
* @param options Map, with each key an option name and each value (optionally) the corresponding option value
* @param operands the operands to the command
* @return argument list for RemoteCommand
*/
protected String[] prepareRemoteCommandArguments(
String commandName,
Map options,
String[] operands) {
ArrayList result = new ArrayList();
result.add(commandName);
if (options == null) {
options = Collections.EMPTY_MAP;
}
for (Map.Entry entry : options.entrySet()) {
result.add("--" + entry.getKey() + "=" + convertValue(entry.getValue()));
}
if (operands != null) {
for (String o : operands) {
result.add(o);
}
}
return result.toArray(new String[result.size()]);
}
protected ProgramOptions prepareRemoteCommandProgramOptions(
Environment env) throws CommandException {
/*
* Add the authentication information from the
* caller-provided connection identifier.
*/
ServerConnectionIdentifier targetDAS = getTargetDAS();
ProgramOptions po = new ProgramOptions(env);
po.setHost(targetDAS.getHostName());
po.setPort(targetDAS.getHostPort());
po.setUser(targetDAS.getUserName());
po.setSecure(targetDAS.isSecure());
po.setPassword(getTargetDAS().getPassword() != null ?
getTargetDAS().getPassword().toCharArray() : null, ProgramOptions.PasswordLocation.LOCAL_PASSWORD);
po.setOptionsSet(true);
return po;
}
private Object convertValue(Object value) {
if (value instanceof Properties) {
StringBuilder sb = new StringBuilder();
Properties p = (Properties) value;
for (Map.Entry