/*
* JBoss, Home of Professional Open Source.
* Copyright 2011, 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.connector.subsystems.resourceadapters;
import static org.jboss.as.connector.subsystems.resourceadapters.Constants.ARCHIVE;
import static org.jboss.as.connector.subsystems.resourceadapters.Constants.MODULE;
import static org.jboss.as.connector.subsystems.resourceadapters.Constants.RESOURCEADAPTERS_NAME;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
import java.util.LinkedList;
import java.util.List;
import org.jboss.as.connector.logging.ConnectorLogger;
import org.jboss.as.connector.util.ConnectorServices;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.OperationStepHandler;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.dmr.ModelNode;
import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceName;
/**
* @author @author <a href="mailto:stefano.maestri@redhat.com">Stefano
* Maestri</a>
*/
public class RaRemove implements OperationStepHandler {
static final RaRemove INSTANCE = new RaRemove();
public void execute(OperationContext context, ModelNode operation) throws OperationFailedException {
final ModelNode opAddr = operation.require(OP_ADDR);
final String idName = PathAddress.pathAddress(opAddr).getLastElement().getValue();
final boolean isModule;
// Compensating is add
final ModelNode model = context.readResource(PathAddress.EMPTY_ADDRESS, false).getModel();
final String archiveOrModuleName;
if (!model.hasDefined(ARCHIVE.getName()) && !model.hasDefined(MODULE.getName())) {
throw ConnectorLogger.ROOT_LOGGER.archiveOrModuleRequired();
}
if (model.get(ARCHIVE.getName()).isDefined()) {
isModule = false;
archiveOrModuleName = model.get(ARCHIVE.getName()).asString();
} else {
isModule = true;
archiveOrModuleName = model.get(MODULE.getName()).asString();
}
final ModelNode compensating = Util.getEmptyOperation(ADD, opAddr);
if (model.hasDefined(RESOURCEADAPTERS_NAME)) {
for (ModelNode raNode : model.get(RESOURCEADAPTERS_NAME).asList()) {
ModelNode raCompensatingNode = raNode.clone();
compensating.get(RESOURCEADAPTERS_NAME).add(raCompensatingNode);
}
}
context.removeResource(PathAddress.EMPTY_ADDRESS);
context.addStep(new OperationStepHandler() {
public void execute(OperationContext context, ModelNode operation) throws OperationFailedException {
final boolean wasActive;
wasActive = RaOperationUtil.removeIfActive(context, archiveOrModuleName, idName);
if (wasActive) {
if(!context.isResourceServiceRestartAllowed()) {
context.reloadRequired();
context.completeStep(new OperationContext.RollbackHandler() {
@Override
public void handleRollback(OperationContext context, ModelNode operation) {
context.revertReloadRequired();
}
});
return;
}
}
ServiceName raServiceName = ServiceName.of(ConnectorServices.RA_SERVICE, idName);
ServiceController<?> serviceController = context.getServiceRegistry(false).getService(raServiceName);
final ModifiableResourceAdapter resourceAdapter;
if (serviceController != null) {
resourceAdapter = (ModifiableResourceAdapter) serviceController.getValue();
} else {
resourceAdapter = null;
}
final List<ServiceName> serviceNameList = context.getServiceRegistry(false).getServiceNames();
for (ServiceName name : serviceNameList) {
if (raServiceName.isParentOf(name)) {
context.removeService(name);
}
}
if (model.get(MODULE.getName()).isDefined()) {
//ServiceName deploymentServiceName = ConnectorServices.getDeploymentServiceName(model.get(MODULE.getName()).asString(),raId);
//context.removeService(deploymentServiceName);
ServiceName deployerServiceName = ConnectorServices.RESOURCE_ADAPTER_DEPLOYER_SERVICE_PREFIX.append(idName);
context.removeService(deployerServiceName);
ServiceName inactiveServiceName = ConnectorServices.INACTIVE_RESOURCE_ADAPTER_SERVICE.append(idName);
context.removeService(inactiveServiceName);
}
context.removeService(raServiceName);
context.completeStep(new OperationContext.RollbackHandler() {
@Override
public void handleRollback(OperationContext context, ModelNode operation) {
if (resourceAdapter != null) {
List<ServiceController<?>> newControllers = new LinkedList<ServiceController<?>>();
if (model.get(ARCHIVE.getName()).isDefined()) {
RaOperationUtil.installRaServices(context, idName, resourceAdapter, newControllers);
} else {
try {
RaOperationUtil.installRaServicesAndDeployFromModule(context, idName, resourceAdapter, archiveOrModuleName, newControllers);
} catch (OperationFailedException e) {
}
}
try {
if (wasActive){
RaOperationUtil.activate(context, idName, archiveOrModuleName);
}
} catch (OperationFailedException e) {
}
}
}
});
}
}, OperationContext.Stage.RUNTIME);
}
}