I did a couple of small fixes to AbstractComponentDeployer.
I'll comment my changes on the svn diff
public void internalDeploy(DeploymentUnit unit) throws DeploymentException { super.internalDeploy(unit); try { deployComponents(unit); } catch (Throwable t) { // we need to unwind the super too // the actual component unwinding is done // at the point of failure - undeployComponents(unit); + super.internalUndeploy(unit); throw DeploymentException.rethrowAsDeploymentException("Error deploying: " + unit.getName(), t); } } public void internalUndeploy(DeploymentUnit unit) { // make it asymetric - super.internalUndeploy(unit); undeployComponents(unit); + super.internalUndeploy(unit); } protected void deployComponents(DeploymentUnit unit) throws DeploymentException @@ -100,9 +101,7 @@ if (compVisitor == null) return; // this now uses extracted super method - see below - Set<? extends C> components = unit.getAllMetaData(getOutput()); - for (C component : components) - compVisitor.deploy(unit, component); + deploy(unit, compVisitor); }
protected <U> void deploy(DeploymentUnit unit, DeploymentVisitor<U> visitor) throws DeploymentException { List<U> visited = new ArrayList<U>(); try { Set<? extends U> deployments = unit.getAllMetaData(visitor.getVisitorType()); for (U deployment : deployments) { visitor.deploy(unit, deployment); visited.add(deployment); } } catch (Throwable t) { for (int i = visited.size()-1; i >= 0; --i) { try { visitor.undeploy(unit, visited.get(i)); } catch (Throwable ignored) { log.warn("Error during undeploy: " + unit.getName(), ignored); } } throw DeploymentException.rethrowAsDeploymentException("Error deploying: " + unit.getName(), t); } }