/*
* 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 java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Properties;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.deployment.DeploymentException;
import org.apache.axis2.deployment.repository.util.DeploymentFileData;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.libraries.imports.SynapseImport;
import org.apache.synapse.libraries.model.Library;
import org.apache.synapse.libraries.util.LibDeployerUtils;
public class LibraryArtifactDeployer extends AbstractSynapseArtifactDeployer {
private static final Log log = LogFactory.getLog(LibraryArtifactDeployer.class);
public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException {
String libFilePath = FilenameUtils.normalize(deploymentFileData.getAbsolutePath());
if (log.isDebugEnabled()) {
log.debug("Deployment of the synapse library artifact from file : " + libFilePath
+ " : STARTED");
}
// if (getServerContextInformation().getServerState() !=
// ServerState.STARTED) {
// // synapse server has not yet being started
// if (log.isDebugEnabled()) {
// log.debug("Skipped the library artifact deployment (since the Synapse "
// +
// "server doesn't seem to be started yet), from file : "
// + deploymentFileData.getAbsolutePath());
// }
// return;
// }
try {
SynapseArtifactDeploymentStore deploymentStore = getSynapseConfiguration()
.getArtifactDeploymentStore();
Library lib = LibDeployerUtils.createSynapseLibrary(libFilePath);
String libArtifactName = lib.getQName().toString();
if (this.getSynapseConfiguration().getSynapseLibraries().get(lib.getQName().toString()) != null) {
log.warn("Hot deployment thread picked up an already deployed synapse library - Ignoring");
} else {
if (log.isDebugEnabled()) {
log.debug("Created the Synapse Library : " + libArtifactName + " from : "
+ libFilePath);
}
if (deploymentStore.isUpdatingArtifact(libFilePath)) {
if (log.isDebugEnabled()) {
log.debug("Updating Library artifact detected with filename : " + libFilePath);
}
// this is an hot-update case
String existingArtifactName = deploymentStore
.getUpdatingArtifactWithFileName(libFilePath);
deploymentStore.removeUpdatingArtifact(libFilePath);
undeploySynapseArtifact(existingArtifactName);
// deploy from beginning
// add the library to synapse Config
completeDeployment(lib, libArtifactName);
} else {
// new artifact hot-deployment case
try {
// add the library to synapse Config
completeDeployment(lib, libArtifactName);
} catch (SynapseArtifactDeploymentException sade) {
log.error("Deployment of the Synapse Artifact from file : " + libFilePath
+ " : Failed!", sade);
/*
* log.info("The file has been backed up into : " +
* backupFile(deploymentFileData.getFile()));
*/
}
}
if (libArtifactName != null) {
deploymentStore.addArtifact(libFilePath, libArtifactName);
}
log.info("Synapse Library named '" + lib.toString()
+ "' has been deployed from file : " + libFilePath);
}
} catch (IOException ex) {
handleDeploymentError("Deployment of synapse artifact failed. Error reading "
+ libFilePath + " : " + ex.getMessage(), ex);
} catch (Exception ex) {
handleDeploymentError("Deployment of synapse artifact failed for synapse libray at : "
+ libFilePath + " : " + ex.getMessage(), ex);
}
if (log.isDebugEnabled()) {
log.debug("Deployment of the synapse artifact from file : " + libFilePath
+ " : COMPLETED");
}
}
private void completeDeployment(Library lib, String libArtifactName) throws DeploymentException {
getSynapseConfiguration().addSynapseLibrary(lib.getQName().toString(), lib);
if (log.isDebugEnabled()) {
log.debug("Synapse Library Deployment for lib: " + libArtifactName + " Completed");
}
// each time a library is deployed we check with available imports and
// if necessary (ie:- relevant import is available) load the libraries
SynapseImport synImport = getSynapseConfiguration().getSynapseImports()
.get(libArtifactName);
if (synImport != null && synImport.isStatus()) {
LibDeployerUtils.loadLibArtifacts(synImport, lib);
if (log.isDebugEnabled()) {
log.debug("Loading Synapse Library: " + libArtifactName + " into memory for Import");
}
LibDeployerUtils.deployingLocalEntries(lib, getSynapseConfiguration());
}
}
public void undeploy(String fileName) throws DeploymentException {
fileName = FilenameUtils.normalize(fileName);
if (log.isDebugEnabled()) {
log.debug("UnDeployment of the synapse library from file : " + fileName + " : STARTED");
}
SynapseArtifactDeploymentStore deploymentStore = getSynapseConfiguration()
.getArtifactDeploymentStore();
if (deploymentStore.containsFileName(fileName)) {
File undeployingFile = new File(fileName);
if (fileName.contains(File.separator + "tmp" + File.separator + "carbonapps" + File.separator) && fileName.endsWith(".zip")) {
undeployingFile.delete();
}
// axis2 treats Hot-Update as (Undeployment + deployment), where
// synapse needs to differentiate the Hot-Update from the above two, since it needs
// some validations for a real undeployment. Also this makes sure a zero downtime of the
// synapse artifacts which are being Hot-deployed
if (undeployingFile.exists()) {
if (log.isDebugEnabled()) {
log.debug("Marking artifact as updating from file : " + fileName);
}
// if the file exists, which means it has been updated and is a
// Hot-Update case
if (!deploymentStore.isRestoredFile(fileName)) {
deploymentStore.addUpdatingArtifact(fileName,
deploymentStore.getArtifactNameForFile(fileName));
deploymentStore.removeArtifactWithFileName(fileName);
}
} else {
// if the file doesn't exists then it is an actual undeployment
String artifactName = deploymentStore.getArtifactNameForFile(fileName);
try {
// CarbonApplication instance to delete
Library currentMediationLib = null;
// undeploying the local entries
Collection<Library> appList = getSynapseConfiguration().getSynapseLibraries()
.values();
for (Library mediationLib : appList) {
if (artifactName.equals(mediationLib.getQName().toString())) {
currentMediationLib = mediationLib;
}
}
if (currentMediationLib != null) {
for (String localEntry : currentMediationLib.getLocalEntries()) {
getSynapseConfiguration().removeEntry(localEntry);
}
}
// do un-deployment
undeploySynapseArtifact(artifactName);
deploymentStore.removeArtifactWithFileName(fileName);
log.info("Synapse Library named '" + artifactName + "' has been undeployed");
} catch (SynapseArtifactDeploymentException sade) {
log.error("Unable to undeploy the synapse library artifact from file : "
+ fileName, sade);
}
}
} else {
String msg = "Artifact representing the filename " + fileName
+ " is not deployed on Synapse";
log.error(msg);
throw new DeploymentException(msg);
}
if (log.isDebugEnabled()) {
log.debug("UnDeployment of the synapse library artifact from file : " + fileName
+ " : COMPLETED");
}
}
public void undeploySynapseArtifact(String artifactName) {
// get Old Lib config
Library existingLib = null;
try {
existingLib = getSynapseConfiguration().getSynapseLibraries().get(artifactName);
existingLib.unLoadLibrary();
getSynapseConfiguration().removeSynapseImport(artifactName);
getSynapseConfiguration().removeSynapseLibrary(artifactName);
} catch (DeploymentException e) {
handleDeploymentError(e.getMessage(), e);
}
}
private void handleDeploymentError(String msg, Exception e) {
log.error(msg, e);
}
// avoid implementing any of the below methods since these are unusable in
// this library deployment
// scenario . we just want to inherit some of the methods from
// AbstractSynapseArtifactDeployer
public void setDirectory(String directory) {
}
public void setExtension(String extension) {
}
public String deploySynapseArtifact(OMElement artifactConfig, String fileName,
Properties properties) {
return null;
}
public String updateSynapseArtifact(OMElement artifactConfig, String fileName,
String existingArtifactName, Properties properties) {
return null;
}
public void restoreSynapseArtifact(String artifactName) {
}
}