/* * JBoss, Home of Professional Open Source. * Copyright 2010, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.controller.client.helpers.standalone.impl; import static org.jboss.as.controller.client.helpers.ClientConstants.ADD; import static org.jboss.as.controller.client.helpers.ClientConstants.ADD_CONTENT; import static org.jboss.as.controller.client.helpers.ClientConstants.COMPOSITE; import static org.jboss.as.controller.client.helpers.ClientConstants.CONTENT; import static org.jboss.as.controller.client.helpers.ClientConstants.DEPLOYMENT; import static org.jboss.as.controller.client.helpers.ClientConstants.DEPLOYMENT_DEPLOY_OPERATION; import static org.jboss.as.controller.client.helpers.ClientConstants.DEPLOYMENT_FULL_REPLACE_OPERATION; import static org.jboss.as.controller.client.helpers.ClientConstants.DEPLOYMENT_REDEPLOY_OPERATION; import static org.jboss.as.controller.client.helpers.ClientConstants.DEPLOYMENT_REMOVE_OPERATION; import static org.jboss.as.controller.client.helpers.ClientConstants.DEPLOYMENT_REPLACE_OPERATION; import static org.jboss.as.controller.client.helpers.ClientConstants.DEPLOYMENT_UNDEPLOY_OPERATION; import static org.jboss.as.controller.client.helpers.ClientConstants.EMPTY; import static org.jboss.as.controller.client.helpers.ClientConstants.EXPLODE; import static org.jboss.as.controller.client.helpers.ClientConstants.INPUT_STREAM_INDEX; import static org.jboss.as.controller.client.helpers.ClientConstants.NAME; import static org.jboss.as.controller.client.helpers.ClientConstants.OP; import static org.jboss.as.controller.client.helpers.ClientConstants.OPERATION_HEADERS; import static org.jboss.as.controller.client.helpers.ClientConstants.OP_ADDR; import static org.jboss.as.controller.client.helpers.ClientConstants.PATHS; import static org.jboss.as.controller.client.helpers.ClientConstants.REMOVE_CONTENT; import static org.jboss.as.controller.client.helpers.ClientConstants.ROLLBACK_ON_RUNTIME_FAILURE; import static org.jboss.as.controller.client.helpers.ClientConstants.RUNTIME_NAME; import static org.jboss.as.controller.client.helpers.ClientConstants.STEPS; import static org.jboss.as.controller.client.helpers.ClientConstants.TARGET_PATH; import static org.jboss.as.controller.client.helpers.ClientConstants.TO_REPLACE; import java.io.InputStream; import java.util.Map.Entry; import java.util.concurrent.Future; import org.jboss.as.controller.client.Operation; import org.jboss.as.controller.client.OperationBuilder; import org.jboss.as.controller.client.logging.ControllerClientLogger; import org.jboss.as.controller.client.helpers.standalone.DeploymentPlan; import org.jboss.as.controller.client.helpers.standalone.InitialDeploymentPlanBuilder; import org.jboss.as.controller.client.helpers.standalone.ServerDeploymentManager; import org.jboss.as.controller.client.helpers.standalone.ServerDeploymentPlanResult; import org.jboss.dmr.ModelNode; /** * @author Emanuel Muckenhuber * @author Brian Stansberry */ public abstract class AbstractServerDeploymentManager implements ServerDeploymentManager { protected AbstractServerDeploymentManager() { } /** {@inheritDoc} */ @Override public InitialDeploymentPlanBuilder newDeploymentPlan() { return InitialDeploymentPlanBuilderFactory.newInitialDeploymentPlanBuilder(); } /** {@inheritDoc} */ @Override public Future<ServerDeploymentPlanResult> execute(DeploymentPlan plan) { if (!(plan instanceof DeploymentPlanImpl)) { throw ControllerClientLogger.ROOT_LOGGER.cannotUseDeploymentPlan(); } DeploymentPlanImpl planImpl = (DeploymentPlanImpl) plan; Operation operation = getCompositeOperation(planImpl); Future<ModelNode> nodeFuture = executeOperation(operation); return new ServerDeploymentPlanResultFuture(planImpl, nodeFuture); } protected abstract Future<ModelNode> executeOperation(Operation context); private Operation getCompositeOperation(DeploymentPlanImpl plan) { ModelNode op = new ModelNode(); op.get(OP).set(COMPOSITE); op.get(OP_ADDR).setEmptyList(); ModelNode steps = op.get(STEPS); steps.setEmptyList(); op.get(OPERATION_HEADERS, ROLLBACK_ON_RUNTIME_FAILURE).set(plan.isGlobalRollback()); // FIXME deal with shutdown params OperationBuilder builder = new OperationBuilder(op); int stream = 0; for (DeploymentActionImpl action : plan.getDeploymentActionImpls()) { ModelNode step = new ModelNode(); String uniqueName = action.getDeploymentUnitUniqueName(); switch (action.getType()) { case ADD: { configureDeploymentOperation(step, ADD, uniqueName); if(action.getNewContentFileName() != null && action.getContentStream() != null) { step.get(RUNTIME_NAME).set(action.getNewContentFileName()); builder.addInputStream(action.getContentStream()); step.get(CONTENT).get(0).get(INPUT_STREAM_INDEX).set(stream++); } else if(action.getContents() != null && !action.getContents().isEmpty()) { int index = 0; for(Entry<String, InputStream> content : action.getContents().entrySet()) { step.get(RUNTIME_NAME).set(content.getKey()); builder.addInputStream(content.getValue()); step.get(CONTENT).get(index).get(INPUT_STREAM_INDEX).set(stream++); index++; } } else { step.get(CONTENT).get(0).get(EMPTY).set(true); } break; } case DEPLOY: { configureDeploymentOperation(step, DEPLOYMENT_DEPLOY_OPERATION, uniqueName); break; } case FULL_REPLACE: { step.get(OP).set(DEPLOYMENT_FULL_REPLACE_OPERATION); step.get(OP_ADDR).setEmptyList(); step.get(NAME).set(uniqueName); step.get(RUNTIME_NAME).set(action.getNewContentFileName()); builder.addInputStream(action.getContentStream()); step.get(CONTENT).get(0).get(INPUT_STREAM_INDEX).set(stream++); break; } case REDEPLOY: { configureDeploymentOperation(step, DEPLOYMENT_REDEPLOY_OPERATION, uniqueName); break; } case REMOVE: { configureDeploymentOperation(step, DEPLOYMENT_REMOVE_OPERATION, uniqueName); break; } case REPLACE: { step.get(OP).set(DEPLOYMENT_REPLACE_OPERATION); step.get(OP_ADDR).setEmptyList(); step.get(NAME).set(uniqueName); step.get(TO_REPLACE).set(action.getReplacedDeploymentUnitUniqueName()); break; } case UNDEPLOY: { configureDeploymentOperation(step, DEPLOYMENT_UNDEPLOY_OPERATION, uniqueName); break; } case ADD_CONTENT: { configureDeploymentOperation(step, ADD_CONTENT, uniqueName); int i = 0; for (Entry<String, InputStream> content : action.getContents().entrySet()) { builder.addInputStream(content.getValue()); step.get(CONTENT).get(i).get(INPUT_STREAM_INDEX).set(stream++); step.get(CONTENT).get(i).get(TARGET_PATH).set(content.getKey()); i++; } break; } case REMOVE_CONTENT: { configureDeploymentOperation(step, REMOVE_CONTENT, uniqueName); step.get(PATHS).setEmptyList(); for (Entry<String, InputStream> content : action.getContents().entrySet()) { step.get(PATHS).add(content.getKey()); } break; } case EXPLODE: { configureDeploymentOperation(step, EXPLODE, uniqueName); break; } default: { throw ControllerClientLogger.ROOT_LOGGER.unknownActionType(action.getType()); } } steps.add(step); } return builder.build(); } private void configureDeploymentOperation(ModelNode op, String operationName, String uniqueName) { op.get(OP).set(operationName); op.get(OP_ADDR).add(DEPLOYMENT, uniqueName); } }