/* * Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. 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.synapse.deployers; import org.apache.axiom.om.OMElement; import org.apache.axis2.deployment.DeploymentException; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.synapse.config.xml.SynapseImportFactory; import org.apache.synapse.libraries.imports.SynapseImport; import org.apache.synapse.libraries.model.Library; import org.apache.synapse.libraries.util.LibDeployerUtils; import javax.xml.namespace.QName; import java.io.File; import java.io.IOException; import java.util.Properties; public class ImportDeployer extends AbstractSynapseArtifactDeployer { private static Log log = LogFactory.getLog(ImportDeployer.class); @Override public String deploySynapseArtifact(OMElement artifactConfig, String fileName, Properties properties) { if (log.isDebugEnabled()) { log.debug("Synapse Import Deployment from file : " + fileName + " : Started"); } try { SynapseImport synImport = SynapseImportFactory.createImport(artifactConfig, properties); String synImportQualfiedName = LibDeployerUtils.getQualifiedName(synImport); SynapseImport existingImport = getSynapseConfiguration().getSynapseImports().get(synImportQualfiedName); if (existingImport != null) { //a synapse import with the same name (name + version) already exists //we should not allow multiple such imports log.warn("Synapse Import with the name : " + synImportQualfiedName + " already exists! " + "Could not load multiple Imports of same type."); String backedUp = backupFile(new File(fileName)); log.info("Synapse Import with the name : " + synImportQualfiedName + " is now backed up in : " + backedUp); return null; } else { if (synImport != null) { synImport.setFileName((new File(fileName)).getName()); getSynapseConfiguration().addSynapseImport(synImportQualfiedName, synImport); //get corresponding library for loading imports if available Library synLib = getSynapseConfiguration().getSynapseLibraries() .get(synImportQualfiedName); if (synLib != null) { if (synImport.isStatus()) { LibDeployerUtils.loadLibArtifacts(synImport, synLib); } else { synLib.setLibStatus(false); synLib.unLoadLibrary(); } } log.info("Synapse Library Import named '" + synImportQualfiedName + " has been deployed from file : " + fileName); return synImportQualfiedName; } else { handleSynapseArtifactDeploymentError("Synapse Import Deployment Failed. " + "The artifact described in the file " + fileName + " is not a valid import"); } } } catch (Exception e) { handleSynapseArtifactDeploymentError( "Sequence Deployment from the file : " + fileName + " : Failed.", e); } return null; } @Override public String updateSynapseArtifact(OMElement artifactConfig, String fileName, String existingArtifactName, Properties properties) { if (log.isDebugEnabled()) { log.debug("Synapse Import Deployment from file : " + fileName + " : Started"); } try { SynapseImport synImport = SynapseImportFactory.createImport(artifactConfig, properties); String synImportQualfiedName = LibDeployerUtils.getQualifiedName(synImport); if (synImport == null) { handleSynapseArtifactDeploymentError("Synapse Import update failed. The artifact " + "defined in the file: " + fileName + " is not a valid import."); return null; } if (log.isDebugEnabled()) { log.debug("Synapse Import: " + synImportQualfiedName + " has been built from the file: " + fileName); } if (existingArtifactName.equals(synImportQualfiedName)) { //normal update ,import Qualified Name(lib name + version) has not changed synImport.setFileName((new File(fileName)).getName()); getSynapseConfiguration().addSynapseImport(synImportQualfiedName, synImport); //get corresponding library for loading imports if available Library synLib = getSynapseConfiguration().getSynapseLibraries() .get(synImportQualfiedName); if (synLib != null) { //this is a important step -> we need to unload what ever the components loaded previously //then reload if (synImport.isStatus()) { synLib.unLoadLibrary(); LibDeployerUtils.loadLibArtifacts(synImport, synLib); }else{ synLib.setLibStatus(false); synLib.unLoadLibrary(); } } log.info("Synapse Library Import named '" + synImportQualfiedName + " has been deployed from file : " + fileName); } else { //when updating ,import Qualified Name has been changed !! //check for any other import with the same name SynapseImport existingImport = getSynapseConfiguration().getSynapseImports().get(synImportQualfiedName); if (existingImport != null) { //a synapse import with the same name (name + version) already exists //we should not allow multiple such imports log.warn("Synapse Import with the name : " + synImportQualfiedName + " already exists! " + "Could not load multiple Imports of same type."); String backedUp = backupFile(new File(fileName)); log.info("Synapse Import with the name : " + synImportQualfiedName + " is now backed up in : " + backedUp); return null; }else { synImport.setFileName((new File(fileName)).getName()); getSynapseConfiguration().addSynapseImport(synImportQualfiedName, synImport); //get corresponding library for loading imports if available Library synLib = getSynapseConfiguration().getSynapseLibraries() .get(synImportQualfiedName); //this is a important step -> we need to unload what ever the components loaded previously synLib.unLoadLibrary(); //then reload if (synLib != null) { LibDeployerUtils.loadLibArtifacts(synImport, synLib); } log.info("Synapse Library Import named '" + synImportQualfiedName + " has been deployed from file : " + fileName); } } log.info("Synapse Import: " + synImportQualfiedName + " has been updated from the file: " + fileName); waitForCompletion(); // Give some time for worker threads to release the old sequence return synImportQualfiedName; } catch (Exception e) { handleSynapseArtifactDeploymentError("Error while updating the Synapse Import from the " + "file: " + fileName); } return null; } @Override public void undeploySynapseArtifact(String artifactName) { if (log.isDebugEnabled()) { log.debug("Undeployment of the Synapse Import named : " + artifactName + " : Started"); } try { SynapseImport undeployingImport = getSynapseConfiguration().getSynapseImports().get(artifactName); if (undeployingImport != null) { getSynapseConfiguration().removeSynapseImport(artifactName); //get corresponding library for un-loading this import Library synLib = getSynapseConfiguration().getSynapseLibraries().get(artifactName); if (synLib != null) { //this is a important step -> we need to unload what ever the components loaded thru this import synLib.unLoadLibrary(); synLib.setLibStatus(false); } log.info("Synapse Import : " + artifactName + "' has been undeployed"); } else { log.warn("Synapse Import : " + artifactName + " has already been undeployed"); } } catch (Exception e) { handleSynapseArtifactDeploymentError( "Undeployement of Synapse Import named : " + artifactName + " : Failed", e); } } @Override public void restoreSynapseArtifact(String artifactName) { //TODO implement --> need to implement the serializer /* if (log.isDebugEnabled()) { log.debug("Restoring the Sequence with name : " + artifactName + " : Started"); } try { SequenceMediator seq = getSynapseConfiguration().getDefinedSequences().get(artifactName); OMElement seqElem = MediatorSerializerFinder.getInstance().getSerializer(seq). serializeMediator(null, seq); if (seq.getFileName() != null) { String fileName = getServerConfigurationInformation().getSynapseXMLLocation() + File.separator + MultiXMLConfigurationBuilder.SEQUENCES_DIR + File.separator + seq.getFileName(); writeToFile(seqElem, fileName); if (log.isDebugEnabled()) { log.debug("Restoring the Sequence with name : " + artifactName + " : Completed"); } log.info("Sequence named '" + artifactName + "' has been restored"); } else { handleSynapseArtifactDeploymentError("Couldn't restore the sequence named '" + artifactName + "', filename cannot be found"); } } catch (Exception e) { handleSynapseArtifactDeploymentError( "Restoring of the sequence named '" + artifactName + "' has failed", e); } */ } private String backupFile(File file) throws DeploymentException { String filePath = FilenameUtils.normalize(file.getAbsolutePath()); String backupFilePath = filePath + ".back"; int backupIndex = 0; while (backupIndex >= 0) { if (new File(backupFilePath).exists()) { backupIndex++; backupFilePath = filePath + "." + backupIndex + ".back"; } else { backupIndex = -1; try { FileUtils.moveFile(file, new File(backupFilePath)); } catch (IOException e) { handleSynapseArtifactDeploymentError("Error while backing up the artifact: " + file.getName(), e); } } } return backupFilePath; } }