You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by ru...@apache.org on 2010/02/14 16:27:53 UTC

svn commit: r910021 - /synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/

Author: ruwan
Date: Sun Feb 14 15:27:53 2010
New Revision: 910021

URL: http://svn.apache.org/viewvc?rev=910021&view=rev
Log:
Re-Store implemented upon an error in the undeployment or update (meaning Hot deployment/update is completed for Synapse :-))

Added:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SynapseArtifactDeploymentException.java
Modified:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/AbstractSynapseArtifactDeployer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EndpointDeployer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EventSourceDeployer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/LocalEntryDeployer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/ProxyServiceDeployer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SequenceDeployer.java

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/AbstractSynapseArtifactDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/AbstractSynapseArtifactDeployer.java?rev=910021&r1=910020&r2=910021&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/AbstractSynapseArtifactDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/AbstractSynapseArtifactDeployer.java Sun Feb 14 15:27:53 2010
@@ -28,6 +28,7 @@
 import org.apache.axis2.deployment.DeploymentException;
 import org.apache.axis2.deployment.repository.util.DeploymentFileData;
 import org.apache.axis2.description.Parameter;
+import org.apache.axis2.util.XMLPrettyPrinter;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.synapse.ServerManager;
@@ -37,11 +38,10 @@
 import org.apache.synapse.core.SynapseEnvironment;
 
 import javax.xml.stream.XMLStreamException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -57,8 +57,15 @@
 public abstract class AbstractSynapseArtifactDeployer implements Deployer {
 
     private static final Log log = LogFactory.getLog(AbstractSynapseArtifactDeployer.class);
+    protected  Log deployerLog;
     protected ConfigurationContext cfgCtx;
     private Map<String, String> updatingArtifacts = new HashMap<String, String>();
+    private List<String> restoredFiles = new ArrayList<String>();
+    private List<String> backedUpFiles = new ArrayList<String>();
+
+    protected AbstractSynapseArtifactDeployer() {
+        deployerLog = LogFactory.getLog(this.getClass());
+    }
 
     /**
      * Initializes the Synapse artifact deployment
@@ -93,6 +100,15 @@
         }
 
         String filename = deploymentFileData.getAbsolutePath();
+
+        // check whether this is triggered by a restore, if it is a restore we do not want to deploy it again
+        if (restoredFiles.contains(filename)) {
+            // only one deployment trigger can happen after a restore and hence remove it from restoredFiles
+            // at the first hit, allowing the further deployments/updates to take place as usual
+            restoredFiles.remove(filename);
+            return;
+        }
+        
         try {
             InputStream in = new FileInputStream(filename);
             try {
@@ -100,13 +116,33 @@
                 // since all synapse artifacts are XML based
                 OMElement element = new StAXOMBuilder(
                         StAXUtils.createXMLStreamReader(in)).getDocumentElement();
-                String artifatcName;
+                String artifatcName = null;
                 if (updatingArtifacts.containsKey(filename)) {
+                    // this is an hot-update case
                     String existingArtifactName = updatingArtifacts.get(filename);
                     updatingArtifacts.remove(filename);
-                    artifatcName = updateSynapseArtifact(element, filename, existingArtifactName);
+                    try {
+                        artifatcName = updateSynapseArtifact(
+                                element, filename, existingArtifactName);
+                    } catch (SynapseArtifactDeploymentException sade) {
+                        log.error("Update of the Synapse Artifact from file : "
+                                + filename + " : Failed!", sade);
+                        log.info("The updated file has been backed up into : "
+                                + backupFile(deploymentFileData.getFile()));
+                        log.info("Restoring the existing artifact into the file : " + filename);
+                        restoreSynapseArtifact(existingArtifactName);
+                        artifatcName = existingArtifactName;
+                    }
                 } else {
-                    artifatcName = deploySynapseArtifact(element, filename);
+                    // new artifact hot-deployment case
+                    try {
+                        artifatcName = deploySynapseArtifact(element, filename);
+                    } catch (SynapseArtifactDeploymentException sade) {
+                        log.error("Deployment of the Synapse Artifact from file : "
+                                + filename + " : Failed!", sade);
+                        log.info("The file has been backed up into : "
+                                + backupFile(deploymentFileData.getFile()));
+                    }
                 }
                 if (artifatcName != null) {
                     FileNameToArtifactNameHolder.getInstance().addArtifact(filename, artifatcName);
@@ -115,14 +151,14 @@
                 in.close();
             }
         } catch (IOException ex) {
-            throw new DeploymentException("Error reading "
-                    + filename + " : " + ex.getMessage(), ex);
+            handleDeploymentError("Deployment of synapse artifact failed. Error reading "
+                    + filename + " : " + ex.getMessage(), ex, filename);
         } catch (XMLStreamException ex) {
-            throw new DeploymentException("Error parsing "
-                    + filename + " : " + ex.getMessage(), ex);
+            handleDeploymentError("Deployment of synapse artifact failed. Error parsing "
+                    + filename + " : " + ex.getMessage(), ex, filename);
         } catch (OMException ex) {
-            throw new DeploymentException("Error parsing "
-                    + filename + " : " + ex.getMessage(), ex);
+            handleDeploymentError("Deployment of synapse artifact failed. Error parsing "
+                    + filename + " : " + ex.getMessage(), ex, filename);
         }
     }
 
@@ -137,6 +173,15 @@
      * @see org.apache.synapse.deployers.AbstractSynapseArtifactDeployer#undeploySynapseArtifact(String) 
      */
     public void unDeploy(String fileName) throws DeploymentException {
+
+        // We want to eliminate the undeployment when we are backing up these files
+        if (backedUpFiles.contains(fileName)) {
+            // only one undeployment trigger can happen after a backup and hence remove it from backedUpFiles
+            // at the first hit, allowing the further undeploymentsto take place as usual
+            backedUpFiles.remove(fileName);
+            return;
+        }
+
         FileNameToArtifactNameHolder holder = FileNameToArtifactNameHolder.getInstance();
         if (holder.containsFileName(fileName)) {
             File undeployingFile = new File(fileName);
@@ -146,14 +191,24 @@
             if (undeployingFile.exists()) {
                 // if the file exists, which means it has been updated and is a Hot-Update case
                 updatingArtifacts.put(fileName, holder.getArtifactNameForFile(fileName));
+                holder.removeArtifactWithFileName(fileName);
             } else {
                 // if the file doesn't exists then it is an actual undeployment
-                undeploySynapseArtifact(holder.getArtifactNameForFile(fileName));
+                String artifactName = holder.getArtifactNameForFile(fileName);
+                try {
+                    undeploySynapseArtifact(artifactName);
+                    holder.removeArtifactWithFileName(fileName);
+                } catch (SynapseArtifactDeploymentException sade) {
+                    log.error("Unable to undeploy the artifact from file : " + fileName, sade);
+                    log.info("Restoring the artifact into the file : " + fileName);
+                    restoreSynapseArtifact(artifactName);
+                }
             }
-            holder.removeArtifactWithFileName(fileName);
         } else {
-            throw new DeploymentException("Artifact representing the filename " + fileName
-                    + " is not deployed on Synapse");
+            String msg = "Artifact representing the filename "
+                    + fileName + " is not deployed on Synapse";
+            log.error(msg);
+            throw new DeploymentException(msg);
         }
     }
 
@@ -196,6 +251,14 @@
      */
     public abstract void undeploySynapseArtifact(String artifactName);
 
+    /**
+     * All synapse artifact deployers MUST implement this method and it handles artifact specific restore
+     * tasks of those artifacts upon a failure of an update or undeployment.
+     *
+     * @param artifactName name of the artifact to be restored
+     */
+    public abstract void restoreSynapseArtifact(String artifactName);
+
     protected SynapseConfiguration getSynapseConfiguration() throws DeploymentException {
         Parameter synCfgParam =
                 cfgCtx.getAxisConfiguration().getParameter(SynapseConstants.SYNAPSE_CONFIG);
@@ -215,4 +278,53 @@
         }
         return (SynapseEnvironment) synCfgParam.getValue();
     }
+
+    protected void writeToFile(OMElement content, String fileName) throws Exception {
+        // this is not good, but I couldn't think of a better design :-(
+        restoredFiles.add(fileName);
+        OutputStream out = new FileOutputStream(new File(fileName));
+        XMLPrettyPrinter.prettify(content, out);
+        out.flush();
+        out.close();
+    }
+
+    protected void handleSynapseArtifactDeploymentError(String msg) {
+        deployerLog.error(msg);
+        throw new SynapseArtifactDeploymentException(msg);
+    }
+
+    protected void handleSynapseArtifactDeploymentError(String msg, Exception e) {
+        deployerLog.error(msg, e);
+        throw new SynapseArtifactDeploymentException(msg, e);
+    }
+
+    private void handleDeploymentError(String msg, Exception e, String fileName) {
+        log.error(msg, e);
+        if (updatingArtifacts.containsKey(fileName)) {
+            backupFile(new File(fileName));
+            log.info("Restoring the existing artifact into the file : " + fileName);
+            restoreSynapseArtifact(updatingArtifacts.get(fileName));
+            FileNameToArtifactNameHolder.getInstance().addArtifact(
+                    fileName, updatingArtifacts.get(fileName));
+            updatingArtifacts.remove(fileName);
+        }
+    }
+
+    private String backupFile(File file) {
+        String filePath = file.getAbsolutePath();
+        backedUpFiles.add(filePath);
+        String backupFilePath = filePath + ".back";
+        int backupIndex = 0;
+        while (backupIndex >= 0) {
+            if (new File(backupFilePath).exists()) {
+                backupIndex++;
+                backupFilePath = filePath + "." + backupIndex + ".back";
+            } else {
+                backupIndex = -1;
+                //noinspection ResultOfMethodCallIgnored
+                file.renameTo(new File(backupFilePath));
+            }
+        }
+        return backupFilePath;
+    }
 }

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EndpointDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EndpointDeployer.java?rev=910021&r1=910020&r2=910021&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EndpointDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EndpointDeployer.java Sun Feb 14 15:27:53 2010
@@ -23,6 +23,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.synapse.config.xml.endpoints.EndpointFactory;
+import org.apache.synapse.config.xml.endpoints.EndpointSerializer;
 import org.apache.synapse.endpoints.Endpoint;
 
 /**
@@ -61,11 +62,12 @@
                         + "' has been deployed from file : " + fileName);
                 return ep.getName();
             } else {
-                log.error("Endpoint Deployment Failed. The artifact described in the file "
-                        + fileName + " is not an Endpoint");
+                handleSynapseArtifactDeploymentError("Endpoint Deployment Failed. The artifact " +
+                        "described in the file " + fileName + " is not an Endpoint");
             }
         } catch (Exception e) {
-            log.error("Endpoint Deployment from the file : " + fileName + " : Failed.", e);
+            handleSynapseArtifactDeploymentError("Endpoint Deployment from the file : "
+                    + fileName + " : Failed.", e);
         }
 
         return null;
@@ -108,11 +110,12 @@
                             "update" : "deployed") + " from file : " + fileName);
                 return ep.getName();
             } else {
-                log.error("Endpoint Update Failed. The artifact described in the file "
-                        + fileName + " is not an Endpoint");
+                handleSynapseArtifactDeploymentError("Endpoint Update Failed. The artifact " +
+                        "described in the file " + fileName + " is not an Endpoint");
             }
         } catch (Exception e) {
-            log.error("Endpoint Update from the file : " + fileName + " : Failed.", e);
+            handleSynapseArtifactDeploymentError(
+                    "Endpoint Update from the file : " + fileName + " : Failed.", e);
         }
 
         return null;
@@ -143,7 +146,36 @@
                 log.error("Couldn't find the endpoint named : " + artifactName);
             }
         } catch (Exception e) {
-            log.error("Endpoint Undeployement of endpoint named : " + artifactName + " : Failed");
+            handleSynapseArtifactDeploymentError("Endpoint Undeployement of endpoint named : "
+                    + artifactName + " : Failed", e);
+        }
+    }
+
+    @Override
+    public void restoreSynapseArtifact(String artifactName) {
+
+        if (log.isDebugEnabled()) {
+            log.debug("Restoring the Endpoint with name : " + artifactName + " : Started");
+        }
+
+        try {
+            Endpoint ep
+                    = getSynapseConfiguration().getDefinedEndpoints().get(artifactName);
+            OMElement epElem = EndpointSerializer.getElementFromEndpoint(ep);
+            if (ep.getFileName() != null) {
+                writeToFile(epElem, ep.getFileName());
+                if (log.isDebugEnabled()) {
+                    log.debug("Restoring the Endpoint with name : "
+                            + artifactName + " : Completed");
+                }
+                log.info("Endpoint named '" + artifactName + "' has been restored");
+            } else {
+                handleSynapseArtifactDeploymentError("Couldn't restore the endpoint named '"
+                        + artifactName + "', filename cannot be found");
+            }
+        } catch (Exception e) {
+            handleSynapseArtifactDeploymentError(
+                    "Restoring of the endpoint named '" + artifactName + "' has failed", e);
         }
     }
 }

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EventSourceDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EventSourceDeployer.java?rev=910021&r1=910020&r2=910021&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EventSourceDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EventSourceDeployer.java Sun Feb 14 15:27:53 2010
@@ -23,6 +23,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.synapse.config.xml.eventing.EventSourceFactory;
+import org.apache.synapse.config.xml.eventing.EventSourceSerializer;
 import org.apache.synapse.eventing.SynapseEventSource;
 
 /**
@@ -61,11 +62,12 @@
                         + "' has been deployed from file : " + fileName);
                 return es.getName();
             } else {
-                log.error("EventSource Deployment Failed. The artifact described in the file "
-                        + fileName + " is not an EventSource");
+                handleSynapseArtifactDeploymentError("EventSource Deployment Failed. The " +
+                        "artifact described in the file " + fileName + " is not an EventSource");
             }
         } catch (Exception e) {
-            log.error("EventSource Deployment from the file : " + fileName + " : Failed.", e);
+            handleSynapseArtifactDeploymentError(
+                    "EventSource Deployment from the file : " + fileName + " : Failed.", e);
         }
 
         return null;
@@ -106,11 +108,12 @@
                             "update" : "deployed") + " from file : " + fileName);
                 return es.getName();
             } else {
-                log.error("EventSource Update Failed. The artifact described in the file "
-                        + fileName + " is not a EventSource");
+                handleSynapseArtifactDeploymentError("EventSource Update Failed. The artifact " +
+                        "described in the file " + fileName + " is not a EventSource");
             }
         } catch (Exception e) {
-            log.error("EventSource Update from the file : " + fileName + " : Failed.", e);
+            handleSynapseArtifactDeploymentError(
+                    "EventSource Update from the file : " + fileName + " : Failed.", e);
         }
 
         return null;
@@ -137,8 +140,35 @@
                 log.error("Couldn't find the EventSource named : " + artifactName);
             }
         } catch (Exception e) {
-            log.error("EventSource Undeployement of EventSource named : "
-                    + artifactName + " : Failed");
+            handleSynapseArtifactDeploymentError("EventSource Undeployement of EventSource named : "
+                    + artifactName + " : Failed", e);
+        }
+    }
+
+    @Override
+    public void restoreSynapseArtifact(String artifactName) {
+
+        if (log.isDebugEnabled()) {
+            log.debug("Restoring the EventSource with name : " + artifactName + " : Started");
+        }
+
+        try {
+            SynapseEventSource es
+                    = getSynapseConfiguration().getEventSource(artifactName);
+            OMElement esElem = EventSourceSerializer.serializeEventSource(null, es);
+            if (es.getFileName() != null) {
+                writeToFile(esElem, es.getFileName());
+                if (log.isDebugEnabled()) {
+                    log.debug("Restoring the EventSource with name : " + artifactName + " : Completed");
+                }
+                log.info("EventSource named '" + artifactName + "' has been restored");
+            } else {
+                handleSynapseArtifactDeploymentError("Couldn't restore the EventSource named '"
+                        + artifactName + "', filename cannot be found");
+            }
+        } catch (Exception e) {
+            handleSynapseArtifactDeploymentError(
+                    "Restoring of the EventSource named '" + artifactName + "' has failed", e);
         }
     }
 }

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/LocalEntryDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/LocalEntryDeployer.java?rev=910021&r1=910020&r2=910021&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/LocalEntryDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/LocalEntryDeployer.java Sun Feb 14 15:27:53 2010
@@ -24,6 +24,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.synapse.config.Entry;
 import org.apache.synapse.config.xml.EntryFactory;
+import org.apache.synapse.config.xml.EntrySerializer;
 
 /**
  *  Handles the <code>LocalEntry</code> deployment and undeployment tasks
@@ -57,11 +58,12 @@
                         + "' has been deployed from file : " + fileName);
                 return e.getKey();
             } else {
-                log.error("LocalEntry Deployment Failed. The artifact described in the file "
-                        + fileName + " is not a LocalEntry");
+                handleSynapseArtifactDeploymentError("LocalEntry Deployment Failed. The artifact " +
+                        "described in the file " + fileName + " is not a LocalEntry");
             }
         } catch (Exception e) {
-            log.error("LocalEntry Deployment from the file : " + fileName + " : Failed.", e);
+            handleSynapseArtifactDeploymentError(
+                    "LocalEntry Deployment from the file : " + fileName + " : Failed.", e);
         }
 
         return null;
@@ -97,11 +99,12 @@
                             "updated" : "deployed") + " from file : " + fileName);
                 return e.getKey();
             } else {
-                log.error("LocalEntry Update Failed. The artifact described in the file "
-                        + fileName + " is not a LocalEntry");
+                handleSynapseArtifactDeploymentError("LocalEntry Update Failed. The artifact " +
+                        "described in the file " + fileName + " is not a LocalEntry");
             }
         } catch (Exception e) {
-            log.error("LocalEntry Update from the file : " + fileName + " : Failed.", e);
+            handleSynapseArtifactDeploymentError(
+                    "LocalEntry Update from the file : " + fileName + " : Failed.", e);
         }
 
         return null;
@@ -128,7 +131,34 @@
                 log.error("Couldn't find the LocalEntry named : " + artifactName);
             }
         } catch (Exception e) {
-            log.error("LocalEntry Undeployement of entry named : " + artifactName + " : Failed");
+            handleSynapseArtifactDeploymentError(
+                    "LocalEntry Undeployement of entry named : " + artifactName + " : Failed", e);
+        }
+    }
+
+    @Override
+    public void restoreSynapseArtifact(String artifactName) {
+
+        if (log.isDebugEnabled()) {
+            log.debug("LocalEntry the Sequence with name : " + artifactName + " : Started");
+        }
+
+        try {
+            Entry e = getSynapseConfiguration().getDefinedEntries().get(artifactName);
+            OMElement entryElem = EntrySerializer.serializeEntry(e, null);
+            if (e.getFileName() != null) {
+                writeToFile(entryElem, e.getFileName());
+                if (log.isDebugEnabled()) {
+                    log.debug("Restoring the LocalEntry with name : " + artifactName + " : Completed");
+                }
+                log.info("LocalEntry named '" + artifactName + "' has been restored");
+            } else {
+                handleSynapseArtifactDeploymentError("Couldn't restore the LocalEntry named '"
+                        + artifactName + "', filename cannot be found");
+            }
+        } catch (Exception e) {
+            handleSynapseArtifactDeploymentError(
+                    "Restoring of the LocalEntry named '" + artifactName + "' has failed", e);
         }
     }
 }

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/ProxyServiceDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/ProxyServiceDeployer.java?rev=910021&r1=910020&r2=910021&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/ProxyServiceDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/ProxyServiceDeployer.java Sun Feb 14 15:27:53 2010
@@ -23,8 +23,8 @@
 import org.apache.axis2.deployment.DeploymentException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.synapse.ManagedLifecycle;
 import org.apache.synapse.config.xml.ProxyServiceFactory;
+import org.apache.synapse.config.xml.ProxyServiceSerializer;
 import org.apache.synapse.core.axis2.ProxyService;
 
 /**
@@ -69,11 +69,12 @@
                         + "' has been deployed from file : " + fileName);
                 return proxy.getName();
             } else {
-                log.error("ProxyService Deployment Failed. The artifact described in the file "
-                        + fileName + " is not a ProxyService");
+                handleSynapseArtifactDeploymentError("ProxyService Deployment Failed. The " +
+                        "artifact described in the file " + fileName + " is not a ProxyService");
             }
         } catch (Exception e) {
-            log.error("ProxyService Deployment from the file : " + fileName + " : Failed.", e);
+            handleSynapseArtifactDeploymentError(
+                    "ProxyService Deployment from the file : " + fileName + " : Failed.", e);
         }
 
         return null;
@@ -119,11 +120,12 @@
                             "update" : "deployed") + " from file : " + fileName);
                 return proxy.getName();
             } else {
-                log.error("ProxyService Update Failed. The artifact described in the file "
-                        + fileName + " is not a ProxyService");
+                handleSynapseArtifactDeploymentError("ProxyService Update Failed. The artifact " +
+                        "described in the file " + fileName + " is not a ProxyService");
             }
         } catch (Exception e) {
-            log.error("ProxyService Update from the file : " + fileName + " : Failed.", e);
+            handleSynapseArtifactDeploymentError(
+                    "ProxyService Update from the file : " + fileName + " : Failed.", e);
         }
 
         return null;
@@ -154,7 +156,36 @@
                 log.error("Couldn't find the ProxyService named : " + artifactName);
             }
         } catch (Exception e) {
-            log.error("ProxyService Undeployement of proxy named : " + artifactName + " : Failed");
+            handleSynapseArtifactDeploymentError(
+                    "ProxyService Undeployement of proxy named : " + artifactName + " : Failed", e);
+        }
+    }
+
+    @Override
+    public void restoreSynapseArtifact(String artifactName) {
+
+        if (log.isDebugEnabled()) {
+            log.debug("Restoring the ProxyService with name : " + artifactName + " : Started");
+        }
+
+        try {
+            ProxyService proxy
+                    = getSynapseConfiguration().getProxyService(artifactName);
+            OMElement proxyElem = ProxyServiceSerializer.serializeProxy(null, proxy);
+            if (proxy.getFileName() != null) {
+                writeToFile(proxyElem, proxy.getFileName());
+                if (log.isDebugEnabled()) {
+                    log.debug("Restoring the ProxyService with name : "
+                            + artifactName + " : Completed");
+                }
+                log.info("ProxyService named '" + artifactName + "' has been restored");
+            } else {
+                handleSynapseArtifactDeploymentError("Couldn't restore the ProxyService named '"
+                        + artifactName + "', filename cannot be found");
+            }
+        } catch (Exception e) {
+            handleSynapseArtifactDeploymentError(
+                    "Restoring of the ProxyService named '" + artifactName + "' has failed", e);
         }
     }
 

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SequenceDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SequenceDeployer.java?rev=910021&r1=910020&r2=910021&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SequenceDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SequenceDeployer.java Sun Feb 14 15:27:53 2010
@@ -25,6 +25,7 @@
 import org.apache.synapse.Mediator;
 import org.apache.synapse.SynapseConstants;
 import org.apache.synapse.config.xml.MediatorFactoryFinder;
+import org.apache.synapse.config.xml.MediatorSerializerFinder;
 import org.apache.synapse.mediators.base.SequenceMediator;
 
 /**
@@ -64,11 +65,12 @@
                         + "' has been deployed from file : " + fileName);
                 return seq.getName();
             } else {
-                log.error("Sequence Deployment Failed. The artifact described in the file "
-                        + fileName + " is not a Sequence");
+                handleSynapseArtifactDeploymentError("Sequence Deployment Failed. " +
+                        "The artifact described in the file " + fileName + " is not a Sequence");
             }
         } catch (Exception e) {
-            log.error("Sequence Deployment from the file : " + fileName + " : Failed.", e);
+            handleSynapseArtifactDeploymentError(
+                    "Sequence Deployment from the file : " + fileName + " : Failed.", e);
         }
 
         return null;
@@ -89,8 +91,8 @@
                 if ((SynapseConstants.MAIN_SEQUENCE_KEY.equals(existingArtifactName)
                         || SynapseConstants.FAULT_SEQUENCE_KEY.equals(existingArtifactName))
                         && !existingArtifactName.equals(seq.getName())) {
-                    log.error(existingArtifactName + " sequence cannot be renamed");
-                    return existingArtifactName;
+                    handleSynapseArtifactDeploymentError(
+                            existingArtifactName + " sequence cannot be renamed");
                 }
                 seq.setFileName(fileName);
                 if (log.isDebugEnabled()) {
@@ -118,11 +120,12 @@
                             "update" : "deployed") + " from file : " + fileName);
                 return seq.getName();
             } else {
-                log.error("Sequence Update Failed. The artifact described in the file "
-                        + fileName + " is not a Sequence");
+                handleSynapseArtifactDeploymentError("Sequence Update Failed. " +
+                        "The artifact described in the file " + fileName + " is not a Sequence");
             }
         } catch (Exception e) {
-            log.error("Sequence Update from the file : " + fileName + " : Failed.", e);
+            handleSynapseArtifactDeploymentError(
+                    "Sequence Update from the file : " + fileName + " : Failed.", e);
         }
 
         return null;
@@ -142,8 +145,8 @@
             if (seq != null) {
                 if (SynapseConstants.MAIN_SEQUENCE_KEY.equals(seq.getName())
                         || SynapseConstants.FAULT_SEQUENCE_KEY.equals(seq.getName())) {
-                    log.error("Cannot Undeploy the " + seq.getName() + " sequence");
-                    return;
+                    handleSynapseArtifactDeploymentError(
+                            "Cannot Undeploy the " + seq.getName() + " sequence");
                 }
                 getSynapseConfiguration().removeSequence(artifactName);
                 if (log.isDebugEnabled()) {
@@ -159,7 +162,36 @@
                 log.error("Couldn't find the sequence named : " + artifactName);
             }
         } catch (Exception e) {
-            log.error("Sequence Undeployement of sequence named : " + artifactName + " : Failed");
+            handleSynapseArtifactDeploymentError(
+                    "Sequence Undeployement of sequence named : " + artifactName + " : Failed", e);
+        }
+    }
+
+    @Override
+    public void restoreSynapseArtifact(String artifactName) {
+
+        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) {
+                writeToFile(seqElem, seq.getFileName());
+                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);
         }
     }
 }

Added: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SynapseArtifactDeploymentException.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SynapseArtifactDeploymentException.java?rev=910021&view=auto
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SynapseArtifactDeploymentException.java (added)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SynapseArtifactDeploymentException.java Sun Feb 14 15:27:53 2010
@@ -0,0 +1,42 @@
+/*
+ *  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.synapse.deployers;
+
+/**
+ * Represents an exception for synapse artifact deployment issues. Throwing a SynapseArtifactDeploymentException
+ * in the implementations of the {@link org.apache.synapse.deployers.AbstractSynapseArtifactDeployer} will cause the
+ * respective artifact to be re-stored, if it is either being updated or undeployed
+ *
+ * @see org.apache.synapse.deployers.AbstractSynapseArtifactDeployer
+ */
+public class SynapseArtifactDeploymentException extends RuntimeException {
+
+    public SynapseArtifactDeploymentException(String message) {
+        super(message);
+    }
+
+    public SynapseArtifactDeploymentException(Throwable cause) {
+        super(cause);
+    }
+
+    public SynapseArtifactDeploymentException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}