/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.axis2.clustering.control; import org.apache.axis2.clustering.ClusteringConstants; import org.apache.axis2.clustering.ClusteringFault; import org.apache.axis2.clustering.ClusteringUtils; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.description.AxisModule; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.AxisServiceGroup; import org.apache.axis2.engine.AxisConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.FileNotFoundException; import java.util.Iterator; /** * */ public class GetConfigurationResponseCommand extends ControlCommand { private static final Log log = LogFactory.getLog(GetConfigurationResponseCommand.class); private String[] serviceGroups; public void execute(ConfigurationContext configContext) throws ClusteringFault { AxisConfiguration axisConfig = configContext.getAxisConfiguration(); // Run this code only if this node is not already initialized if (configContext. getPropertyNonReplicable(ClusteringConstants.RECD_CONFIG_INIT_MSG) == null) { log.info("Received configuration initialization message"); configContext. setNonReplicableProperty(ClusteringConstants.RECD_CONFIG_INIT_MSG, "true"); if (serviceGroups != null) { // Load all the service groups that are sent by the neighbour for (int i = 0; i < serviceGroups.length; i++) { String serviceGroup = serviceGroups[i]; if (axisConfig.getServiceGroup(serviceGroup) == null) { //Load the service group try { ClusteringUtils.loadServiceGroup(serviceGroup, configContext, System.getProperty("axis2.work.dir")); //TODO: Introduce a constant. work dir is a temp dir. } catch (FileNotFoundException ignored) { } catch (Exception e) { throw new ClusteringFault(e); } } } //TODO: We support only AAR files for now // Unload all service groups which were not sent by the neighbour, // but have been currently loaded for (Iterator iter = axisConfig.getServiceGroups(); iter.hasNext();) { AxisServiceGroup serviceGroup = (AxisServiceGroup) iter.next(); boolean foundServiceGroup = false; for (int i = 0; i < serviceGroups.length; i++) { String serviceGroupName = serviceGroups[i]; if (serviceGroup.getServiceGroupName().equals(serviceGroupName)) { foundServiceGroup = true; break; } } if (!foundServiceGroup) { boolean mustUnloadServiceGroup = true; // Verify that this service was not loaded from within a module // If so, we must not unload such a service for (Iterator serviceIter = serviceGroup.getServices(); serviceIter.hasNext();) { AxisService service = (AxisService) serviceIter.next(); if (service.isClientSide() || service.getParameter(AxisModule.MODULE_SERVICE) != null) { // Do not unload service groups containing client side services or ones deployed from within modules mustUnloadServiceGroup = false; break; } } if (mustUnloadServiceGroup) { try { axisConfig.removeServiceGroup(serviceGroup.getServiceGroupName()); } catch (Exception e) { throw new ClusteringFault(e); } } } } } } } public void setServiceGroups(String[] serviceGroups) { this.serviceGroups = serviceGroups; } public String toString() { return "GetConfigurationResponseCommand"; } }