[jboss-cvs] JBossAS SVN: r96233 - in projects/ejb3/trunk/package-manager: src/main/java/org/jboss/ejb3/packagemanager and 27 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Nov 10 15:54:12 EST 2009


Author: jaikiran
Date: 2009-11-10 15:54:11 -0500 (Tue, 10 Nov 2009)
New Revision: 96233

Added:
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerFactory.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/annotation/
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/annotation/TransactionAttribute.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/annotation/TransactionAttributeType.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/PostUnInstallScript.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/PreUnInstallScript.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/Script.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PostUnInstallType.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PreUnInstallType.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostUnInstallImpl.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostUnInstallScript.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreUnInstallImpl.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreUninstallScript.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/proxy/
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/proxy/PackageManagerInvocationHandler.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/tx/
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/tx/JBossJTABasedTransactionManagerLookup.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/tx/TransactionManagerImpl.java
   projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/upgrade/
   projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/upgrade/unit/
   projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/upgrade/unit/UpgradeUnitTestCase.java
   projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-post-install-script.xml
   projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-post-uninstall-script.xml
   projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-pre-uninstall-script.xml
Modified:
   projects/ejb3/trunk/package-manager/pom.xml
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageContext.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManager.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerContext.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerEnvironment.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/db/DefaultDatabaseManager.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/db/PackageDatabaseManager.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/InstalledPackage.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageContext.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageManagerContext.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageManagerImpl.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/installer/AbstractInstaller.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/main/Main.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PackageInstallationPhase.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PackageType.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PostInstallType.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PreInstallType.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/ScriptType.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PackageImpl.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostInstallImpl.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostInstallScript.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreInstallImpl.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreInstallScript.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/ScriptImpl.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/script/ScriptProcessor.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/script/impl/AntScriptProcessor.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/util/IOUtil.java
   projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/xml/PackageUnmarshaller.java
   projects/ejb3/trunk/package-manager/src/main/resources/META-INF/persistence.xml
   projects/ejb3/trunk/package-manager/src/main/resources/log4j.xml
   projects/ejb3/trunk/package-manager/src/main/resources/package.xsd
   projects/ejb3/trunk/package-manager/src/main/resources/schema.sql
   projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/commandline/unit/CommandLineTestCase.java
   projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/common/PackageManagerTestCase.java
   projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/dependency/unit/DependencyInstallTestCase.java
   projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/install/unit/BasicInstallTestCase.java
   projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/uninstall/unit/UnInstallTestCase.java
   projects/ejb3/trunk/package-manager/src/test/resources/log4j.xml
   projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/build.xml
   projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-pre-install-script.xml
   projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package1.xml
   projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package2.xml
   projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package3.xml
Log:
EJBTHREE-1942 * Added support for transactions * Support for pre/post uninstall scripts * Better DB interaction

Modified: projects/ejb3/trunk/package-manager/pom.xml
===================================================================
--- projects/ejb3/trunk/package-manager/pom.xml	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/pom.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -208,6 +208,23 @@
             <scope>runtime</scope>
         </dependency>
         
+        <!--  Tx support -->
+        <dependency>
+            <groupId>jboss.jbossts</groupId>
+            <artifactId>jbossjta</artifactId>
+            <version>4.4.0.GA</version>
+        </dependency>
+        <dependency>
+            <groupId>jboss.jbossts</groupId>
+            <artifactId>jbossjts</artifactId>
+            <version>4.4.0.GA</version>
+        </dependency>
+        
+        <dependency>
+            <groupId>jboss.jbossts</groupId>
+            <artifactId>jbossts-common</artifactId>
+            <version>4.4.0.GA</version>
+        </dependency>
 
         <!-- Tests -->
         <dependency>

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageContext.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageContext.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageContext.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -29,6 +29,10 @@
 import org.jboss.ejb3.packagemanager.metadata.InstallFileType;
 import org.jboss.ejb3.packagemanager.metadata.ScriptType;
 import org.jboss.ejb3.packagemanager.metadata.SystemRequirementsType;
+import org.jboss.ejb3.packagemanager.metadata.impl.PostInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PostUnInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PreInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PreUninstallScript;
 
 /**
  * PackageContext
@@ -53,8 +57,16 @@
     */
    File getPackageRoot();
 
+   /**
+    * Returns the name of the package
+    * @return
+    */
    String getPackageName();
 
+   /**
+    * Returns the version of the package
+    * @return
+    */
    String getPackageVersion();
 
    /**
@@ -63,11 +75,40 @@
     */
    Set<PackageContext> getDependencyPackages();
 
+   /**
+    * Returns the system requirements of this package 
+    * @return
+    */
    SystemRequirementsType getSystemRequirements();
 
-   List<ScriptType> getPostInstallScripts();
+   /**
+    * Returns the post-install scripts
+    * @return
+    */
+   List<PostInstallScript> getPostInstallScripts();
 
-   List<ScriptType> getPreInstallScripts();
+   /**
+    * Returns the pre-install scripts
+    * @return
+    */
+   List<PreInstallScript> getPreInstallScripts();
 
+   /**
+    * Returns the files to be installed by this package
+    * @return
+    */
    List<InstallFileType> getInstallationFiles();
+   
+   /**
+    * Returns the pre-uninstall scripts
+    * @return
+    */
+   List<PreUninstallScript> getPreUnInstallScripts();
+   
+   /**
+    * Returns the post-uninstall scripts
+    * @return
+    */
+   List<PostUnInstallScript> getPostUnInstallScripts();
+  
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManager.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManager.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManager.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -23,6 +23,8 @@
 
 import java.net.URL;
 
+import javax.transaction.TransactionManager;
+
 import org.jboss.ejb3.packagemanager.exception.PackageManagerException;
 import org.jboss.ejb3.packagemanager.exception.PackageNotInstalledException;
 
@@ -88,4 +90,8 @@
     * @return Returns the JBoss Server Home
     */
    String getServerHome();
+   
+   TransactionManager getTransactionManager();
+   
+   
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerContext.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerContext.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerContext.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -22,7 +22,9 @@
 
 package org.jboss.ejb3.packagemanager;
 
+import org.jboss.ejb3.packagemanager.metadata.ScriptType;
 
+
 /**
  * Author: Jaikiran Pai
  */
@@ -42,4 +44,14 @@
      */
     String getJBossServerHome();
     
+    /**
+     * Returns the location (relative to the package manager home) where the script files
+     * of the package corresponding to the <code>pkgContext</code> is persisted. 
+     * Persistent script files can be used during uninstallation of packages.
+     * 
+     * @param pkgContext Package context, whose script location is required 
+     * @return
+     */
+    String getScriptStoreLocation(PackageContext pkgContext);
+    
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerEnvironment.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerEnvironment.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerEnvironment.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -40,6 +40,10 @@
    private File packageManagerBuildDir;
 
    private File packageManagerTmpDir;
+   
+   private File packageManagerScriptStoreDir;
+   
+   private File packageManagerDataDir;
 
    private Map<String, String> properties = new HashMap<String, String>();
 
@@ -76,7 +80,16 @@
       {
          this.packageManagerTmpDir.mkdirs();
       }
-
+      this.packageManagerDataDir = new File(packageManagerHome, "data");
+      if (!this.packageManagerDataDir.exists())
+      {
+         this.packageManagerDataDir.mkdirs();
+      }
+      this.packageManagerScriptStoreDir = new File(packageManagerDataDir, "scripts");
+      if (!this.packageManagerScriptStoreDir.exists())
+      {
+         this.packageManagerScriptStoreDir.mkdirs();
+      }
    }
 
    public File getPackageManagerHome()
@@ -93,6 +106,16 @@
    {
       return this.packageManagerTmpDir;
    }
+   
+   public File getDataDir()
+   {
+      return this.packageManagerDataDir;
+   }
+   
+   public File getScriptStoreDir()
+   {
+      return this.packageManagerScriptStoreDir;
+   }
 
    public String getProperty(String propertyName)
    {

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerFactory.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerFactory.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/PackageManagerFactory.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,46 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+
+import org.jboss.ejb3.packagemanager.impl.DefaultPackageManagerImpl;
+import org.jboss.ejb3.packagemanager.proxy.PackageManagerInvocationHandler;
+
+/**
+ * PackageManagerFactory
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class PackageManagerFactory
+{
+
+   public static PackageManager getDefaultPackageManager(PackageManagerEnvironment packageManagerEnv, String jbossHome)
+   {
+      PackageManager pkgManager = new DefaultPackageManagerImpl(packageManagerEnv, jbossHome);
+      InvocationHandler packageManagerInvocationHandler = new PackageManagerInvocationHandler(pkgManager);
+      ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+      return (PackageManager) Proxy.newProxyInstance(tccl, new Class[]{PackageManager.class}, packageManagerInvocationHandler);
+   }
+}

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/annotation/TransactionAttribute.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/annotation/TransactionAttribute.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/annotation/TransactionAttribute.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,40 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * TransactionAttribute
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+ at Target({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface TransactionAttribute 
+{
+   TransactionAttributeType value() default TransactionAttributeType.REQUIRED;
+}

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/annotation/TransactionAttributeType.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/annotation/TransactionAttributeType.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/annotation/TransactionAttributeType.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,34 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.annotation;
+
+/**
+ * TransactionAttributeType
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public enum TransactionAttributeType 
+{
+   REQUIRED,
+   REQUIRES_NEW
+}

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/db/DefaultDatabaseManager.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/db/DefaultDatabaseManager.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/db/DefaultDatabaseManager.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -29,9 +29,9 @@
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
-import javax.persistence.EntityTransaction;
 import javax.persistence.Persistence;
 import javax.persistence.Query;
+import javax.transaction.Synchronization;
 
 import org.jboss.ejb3.packagemanager.PackageContext;
 import org.jboss.ejb3.packagemanager.PackageManagerContext;
@@ -40,9 +40,12 @@
 import org.jboss.ejb3.packagemanager.entity.InstalledPackage;
 import org.jboss.ejb3.packagemanager.entity.PackageDependency;
 import org.jboss.ejb3.packagemanager.entity.PackageManagerEntity;
+import org.jboss.ejb3.packagemanager.entity.PreUnInstallScript;
 import org.jboss.ejb3.packagemanager.exception.PackageManagerException;
 import org.jboss.ejb3.packagemanager.exception.PackageNotInstalledException;
 import org.jboss.ejb3.packagemanager.metadata.InstallFileType;
+import org.jboss.ejb3.packagemanager.metadata.impl.PostUnInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PreUninstallScript;
 import org.jboss.logging.Logger;
 
 /**
@@ -51,7 +54,7 @@
  * @author Jaikiran Pai
  * @version $Revision: $
  */
-public class DefaultDatabaseManager implements PackageDatabaseManager
+public class DefaultDatabaseManager implements PackageDatabaseManager, Synchronization
 {
    /**
     * Logger 
@@ -79,13 +82,14 @@
       this.packageManagerCtx = pkgMgrCtx;
       PackageManagerEnvironment environment = pkgMgrCtx.getPackageManagerEnvironment();
       // we use derby (filesystem) based DB
-      File dbHome = new File(environment.getPackageManagerHome(), "data");
+      File dbHome = environment.getDataDir();
       if (!dbHome.exists())
       {
          dbHome.mkdirs();
       }
       // set the Derby system home property to point to the package manager db
       System.setProperty("derby.system.home", dbHome.getAbsolutePath());
+
       logger.info("Package manager DB home set to " + System.getProperty("derby.system.home"));
       this.entityMgrFactory = Persistence.createEntityManagerFactory("default");
 
@@ -100,10 +104,8 @@
       if (packageManagers == null || packageManagers.isEmpty())
       {
          PackageManagerEntity pm = new PackageManagerEntity(pkgMgrCtx);
-         EntityTransaction tx = em.getTransaction();
-         tx.begin();
          em.persist(pm);
-         tx.commit();
+
          return pm;
       }
       else if (packageManagers.size() > 1)
@@ -124,8 +126,8 @@
    public InstalledPackage installPackage(PackageContext pkgCtx)
    {
       EntityManager em = this.getEntityManager();
-      EntityTransaction tx = em.getTransaction();
-      tx.begin();
+      //      EntityTransaction tx = em.getTransaction();
+      //      tx.begin();
       PackageManagerEntity packageManager = this.getOrCreatePackageManagerEntity(this.packageManagerCtx);
 
       InstalledPackage newlyInstalledPackage;
@@ -138,21 +140,9 @@
          throw new RuntimeException(pme);
       }
 
-      try
-      {
-         em.persist(newlyInstalledPackage);
-         tx.commit();
-         logger.info("Recorded installation of package " + pkgCtx + " to database");
-         return newlyInstalledPackage;
-
-      }
-      catch (Exception e)
-      {
-         tx.rollback();
-         this.removeEntityManager(em);
-         throw new RuntimeException(e);
-      }
-
+      em.persist(newlyInstalledPackage);
+      logger.info("Recorded installation of package " + pkgCtx + " to database");
+      return newlyInstalledPackage;
    }
 
    /**
@@ -214,7 +204,8 @@
     * @return
     * @throws PackageManagerException 
     */
-   private InstalledPackage createPackage(PackageManagerEntity pkgMgrEntity, PackageContext pkgCtx) throws PackageManagerException
+   private InstalledPackage createPackage(PackageManagerEntity pkgMgrEntity, PackageContext pkgCtx)
+         throws PackageManagerException
    {
       InstalledPackage newPackage = new InstalledPackage(pkgMgrEntity, pkgCtx.getPackageName(), pkgCtx
             .getPackageVersion());
@@ -222,21 +213,43 @@
       List<InstallFileType> files = pkgCtx.getInstallationFiles();
       if (files != null)
       {
-         Set<InstalledFile> installationFilesForNewPackage = new HashSet<InstalledFile>(files.size());
-         newPackage.setInstallationFiles(installationFilesForNewPackage);
-
          for (InstallFileType file : files)
          {
             InstalledFile installationFile = new InstalledFile(file.getName(), file.getDestPath());
-            installationFile.setPkg(newPackage);
             if (file.getType() != null)
             {
                installationFile.setFileType(file.getType().toString());
             }
-            installationFilesForNewPackage.add(installationFile);
+            newPackage.addInstallationFile(installationFile);
+            installationFile.setPkg(newPackage);
+
          }
       }
+      String relativePathToScriptStore = this.packageManagerCtx.getScriptStoreLocation(pkgCtx);
+      List<PreUninstallScript> preUnInstallScripts = pkgCtx.getPreUnInstallScripts();
+      if (preUnInstallScripts != null)
+      {
+         for (PreUninstallScript script : preUnInstallScripts)
+         {
+            String scriptName = script.getName();
+            PreUnInstallScript preUnInstallScript = new PreUnInstallScript(newPackage, scriptName,
+                  relativePathToScriptStore);
+            newPackage.addPreUnInstallScript(preUnInstallScript);
+         }
+      }
 
+      List<PostUnInstallScript> postUnInstallScripts = pkgCtx.getPostUnInstallScripts();
+      if (postUnInstallScripts != null)
+      {
+         for (PostUnInstallScript script : postUnInstallScripts)
+         {
+            String scriptName = script.getName();
+            org.jboss.ejb3.packagemanager.entity.PostUnInstallScript postUnInstallScript = new org.jboss.ejb3.packagemanager.entity.PostUnInstallScript(
+                  newPackage, scriptName, relativePathToScriptStore);
+            newPackage.addPostUnInstallScript(postUnInstallScript);
+         }
+      }
+
       Set<PackageContext> dependencyPackages = pkgCtx.getDependencyPackages();
       if (dependencyPackages != null)
       {
@@ -258,54 +271,6 @@
    }
 
    /**
-    * @throws PackageNotInstalledException 
-    * @see org.jboss.ejb3.packagemanager.db.PackageDatabaseManager#upgradePackage(org.jboss.ejb3.packagemanager.entity.InstalledPackage, org.jboss.ejb3.packagemanager.entity.InstalledPackage)
-    */
-   public InstalledPackage upgradePackage(PackageContext packageToUpgrade) throws PackageNotInstalledException
-   {
-      // 1) get all packages which were dependent on the previous version of the package
-      // 2) remove the earlier version of this package being upgraded
-      // 3) save this new version
-      // 4) Update the dependent packages to refer this newer version
-      String packageName = packageToUpgrade.getPackageName();
-      InstalledPackage existingVersionOfPackage = this.getInstalledPackage(packageName);
-      
-      Set<InstalledPackage> dependentPackages = this.getDependentPackages(packageName);
-      EntityManager em = this.getEntityManager();
-      // break the link with the previous version of the package
-      if (dependentPackages != null && !dependentPackages.isEmpty())
-      {
-         for (InstalledPackage dependentPackage : dependentPackages)
-         {
-            dependentPackage.removeDependency(existingVersionOfPackage);
-            em.persist(dependentPackage);
-         }
-         
-      }
-      
-      // remove the package being upgraded
-      this.removePackage(existingVersionOfPackage);
-      
-      // install this newer version
-      InstalledPackage upgradedPackage = this.installPackage(packageToUpgrade);
-      if (dependentPackages != null && !dependentPackages.isEmpty())
-      {
-         // create a new link/dependency on the new version of the package
-         for (InstalledPackage dependentPackage : dependentPackages)
-         {
-               PackageDependency dependency = new PackageDependency();
-               dependency.setDependeePackage(upgradedPackage);
-               dependency.setDependentPackage(dependentPackage);
-               dependentPackage.addDependency(dependency);
-               em.persist(dependentPackage);
-         }
-         
-      }
-      // return the upgraded package
-      return upgradedPackage;
-   }
-
-   /**
     * @see org.jboss.ejb3.packagemanager.db.PackageDatabaseManager#removePackage(java.lang.String)
     */
    @Override
@@ -332,41 +297,42 @@
          em = this.entityMgrFactory.createEntityManager();
          currentEntityManager.set(em);
       }
+
       return em;
    }
 
    /**
-    * TODO: Revisit this
-    * @param em
+    * @see org.jboss.ejb3.packagemanager.db.PackageDatabaseManager#removePackage(org.jboss.ejb3.packagemanager.entity.InstalledPackage)
     */
-   private void removeEntityManager(EntityManager em)
+   @Override
+   public void removePackage(InstalledPackage installedPackage)
    {
-      em.close();
+      EntityManager em = this.getEntityManager();
+      //EntityTransaction tx = em.getTransaction();
+      //tx.begin();
+      installedPackage = em.merge(installedPackage);
+      em.remove(installedPackage);
+      //  tx.commit();
+      logger.info("Deleted installed package = " + installedPackage.getPackageName());
+
+   }
+
+   /**
+    * @see javax.transaction.Synchronization#afterCompletion(int)
+    */
+   @Override
+   public void afterCompletion(int status)
+   {
       currentEntityManager.set(null);
    }
 
    /**
-    * @see org.jboss.ejb3.packagemanager.db.PackageDatabaseManager#removePackage(org.jboss.ejb3.packagemanager.entity.InstalledPackage)
+    * @see javax.transaction.Synchronization#beforeCompletion()
     */
    @Override
-   public void removePackage(InstalledPackage installedPackage)
+   public void beforeCompletion()
    {
-      EntityManager em = this.getEntityManager();
-      EntityTransaction tx = em.getTransaction();
-      tx.begin();
-      try
-      {
-         installedPackage = em.merge(installedPackage);
-         em.remove(installedPackage);
-         tx.commit();
-         logger.info("Deleted installed package = " + installedPackage.getPackageName());
-      }
-      catch (Exception e)
-      {
-         // tx.rollback();
-         this.removeEntityManager(em);
-         throw new RuntimeException(e);
-      }
+      // TODO Auto-generated method stub
 
    }
 

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/db/PackageDatabaseManager.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/db/PackageDatabaseManager.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/db/PackageDatabaseManager.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -100,4 +100,6 @@
     * @param installedPackage The package which has been installed
     */
    void removePackage(InstalledPackage installedPackage);
+   
+   
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/InstalledPackage.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/InstalledPackage.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/InstalledPackage.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -32,6 +32,8 @@
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 
+import org.hibernate.annotations.ForceDiscriminator;
+
 /**
  * Package
  *
@@ -48,13 +50,19 @@
 
    private String version;
 
-   @OneToMany(mappedBy = "dependentPackage", cascade=CascadeType.ALL)
+   @OneToMany(mappedBy = "dependentPackage", cascade = CascadeType.ALL)
    private Set<PackageDependency> dependencies;
 
    @OneToMany(mappedBy = "pkg", cascade = CascadeType.ALL)
    private Set<InstalledFile> installationFiles;
 
-   @ManyToOne 
+   @OneToMany(mappedBy = "installedPkg", cascade = CascadeType.ALL)
+   private Set<PreUnInstallScript> preUnInstallScripts;
+
+   @OneToMany(mappedBy = "installedPkg", cascade = CascadeType.ALL)
+   private Set<PostUnInstallScript> postUnInstallScripts;
+
+   @ManyToOne
    @JoinColumn(name = "package_manager_id")
    private PackageManagerEntity packageManager;
 
@@ -70,7 +78,6 @@
       this.version = packageVersion;
    }
 
-
    public String getPackageName()
    {
       return this.name;
@@ -90,7 +97,55 @@
    {
       this.installationFiles = installationFiles;
    }
+   
+   public void addInstallationFile(InstalledFile file)
+   {
+      if (this.installationFiles == null)
+      {
+         this.installationFiles = new HashSet<InstalledFile>();
+      }
+      this.installationFiles.add(file);
+   }
 
+   public Set<PreUnInstallScript> getPreUnInstallScripts()
+   {
+      return this.preUnInstallScripts;
+   }
+
+   public void setPreUnInstallScript(Set<PreUnInstallScript> preUnInstallScripts)
+   {
+      this.preUnInstallScripts = preUnInstallScripts;
+   }
+
+   public void addPreUnInstallScript(PreUnInstallScript preUnInstallScrtipt)
+   {
+      if (this.preUnInstallScripts == null)
+      {
+         this.preUnInstallScripts = new HashSet<PreUnInstallScript>();
+      }
+      this.preUnInstallScripts.add(preUnInstallScrtipt);
+   }
+
+   public Set<PostUnInstallScript> getPostUnInstallScripts()
+   {
+      return this.postUnInstallScripts;
+   }
+
+   public void setPostUnInstallScript(Set<PostUnInstallScript> postUnInstallScripts)
+   {
+      this.postUnInstallScripts = postUnInstallScripts;
+   }
+
+   public void addPostUnInstallScript(PostUnInstallScript postUnInstallScript)
+   {
+      if (this.postUnInstallScripts == null)
+      {
+         this.postUnInstallScripts = new HashSet<PostUnInstallScript>();
+      }
+      this.postUnInstallScripts.add(postUnInstallScript);
+
+   }
+
    public PackageManagerEntity getPackageManager()
    {
       return packageManager;
@@ -110,7 +165,7 @@
    {
       this.dependencies = dependencies;
    }
-   
+
    public void addDependency(PackageDependency dependency)
    {
       if (this.dependencies == null)
@@ -119,7 +174,7 @@
       }
       this.dependencies.add(dependency);
    }
-   
+
    public void addDependencies(Set<PackageDependency> dependencies)
    {
       if (this.dependencies == null)
@@ -128,7 +183,7 @@
       }
       this.dependencies.addAll(dependencies);
    }
-   
+
    public void removeDependency(PackageDependency dependency)
    {
       if (this.dependencies == null)
@@ -137,8 +192,7 @@
       }
       this.dependencies.remove(dependency);
    }
-   
-   
+
    public void removeDependency(InstalledPackage dependencyPackage)
    {
       if (this.dependencies == null)
@@ -153,10 +207,9 @@
             this.dependencies.remove(dependency);
          }
       }
-      
+
    }
-   
-   
+
    /**
     * @see java.lang.Object#equals(java.lang.Object)
     */
@@ -172,8 +225,8 @@
          return false;
       }
       InstalledPackage otherPackge = (InstalledPackage) obj;
-      return this.name == otherPackge.name; 
-      
+      return this.name == otherPackge.name;
+
    }
 
    /**

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/PostUnInstallScript.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/PostUnInstallScript.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/PostUnInstallScript.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,80 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.entity;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * PostUnInstallScript
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+ at Entity
+ at DiscriminatorValue(value="post-uninstall")
+public class PostUnInstallScript extends Script
+{
+
+   // Bad! Hibernate wants this here, instead of on the super class.
+   // If this field is made available in the super class, and then
+   // there's a one-to-many mapping to this PostUnInstallScript, then
+   // you run into:
+   // Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: 
+   // org.jboss.ejb3.packagemanager.entity.PostUnInstallScript.installedPkg 
+   // in org.jboss.ejb3.packagemanager.entity.InstalledPackage.postUnInstallScripts
+   @ManyToOne 
+   @JoinColumn(name="package_name")
+   protected InstalledPackage installedPkg;
+   
+   private PostUnInstallScript()
+   {
+      //for jpa
+   }
+   
+   public PostUnInstallScript(String fileName, String path)
+   {
+      super(fileName, path);
+   }
+   
+   /**
+    * @param pkg
+    * @param scriptFile
+    */
+   public PostUnInstallScript(InstalledPackage pkg, String fileName, String path)
+   {
+      super(fileName, path);
+      this.installedPkg = pkg;
+   }
+
+   public InstalledPackage getInstalledPkg()
+   {
+      return installedPkg;
+   }
+
+   public void setInstalledPkg(InstalledPackage installedPkg)
+   {
+      this.installedPkg = installedPkg;
+   }
+}

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/PreUnInstallScript.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/PreUnInstallScript.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/PreUnInstallScript.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,80 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.entity;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * PreUnInstallScript
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+ at Entity
+ at DiscriminatorValue(value = "pre-uninstall")
+public class PreUnInstallScript extends Script
+{
+
+   // Bad! Hibernate wants this here, instead of on the super class.
+   // If this field is made available in the super class, and then
+   // there's a one-to-many mapping to this PostUnInstallScript, then
+   // you run into:
+   // Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: 
+   // org.jboss.ejb3.packagemanager.entity.PostUnInstallScript.installedPkg 
+   // in org.jboss.ejb3.packagemanager.entity.InstalledPackage.postUnInstallScripts
+   @ManyToOne
+   @JoinColumn(name = "package_name")
+   protected InstalledPackage installedPkg;
+
+   private PreUnInstallScript()
+   {
+      // for jpa
+   }
+
+   public PreUnInstallScript(String fileName, String path)
+   {
+      super(fileName, path);
+   }
+
+   /**
+    * @param pkg
+    * @param scriptFile
+    */
+   public PreUnInstallScript(InstalledPackage pkg, String fileName, String path)
+   {
+      super(fileName, path);
+      this.installedPkg = pkg;
+   }
+
+   public InstalledPackage getInstalledPkg()
+   {
+      return installedPkg;
+   }
+
+   public void setInstalledPkg(InstalledPackage installedPkg)
+   {
+      this.installedPkg = installedPkg;
+   }
+}

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/Script.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/Script.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/entity/Script.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,123 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.entity;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.ForceDiscriminator;
+
+/**
+ * Script
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+ at Entity
+ at Table (name="script")
+ at Inheritance (strategy=InheritanceType.SINGLE_TABLE)
+ at DiscriminatorColumn (name="scriptType")
+// Hibernate specific issue - Without the "ForcedDiscriminator" annotation
+// it fetches both pre-uninstall/post-uninstall scripts in the set maintained in InstalledPackage
+// OneToMany association. (i.e. if ForceDiscriminator is not used, 
+// thenHibernate does not use the discriminator column in the where clause which fetching the set, 
+// it just uses the join column). See https://forum.hibernate.org/viewtopic.php?t=961213
+ at ForceDiscriminator
+public abstract class Script
+{
+
+   @Id
+   @GeneratedValue(strategy = GenerationType.IDENTITY)
+   protected long id;
+
+   protected String name;
+   
+   protected String path;
+   
+   
+
+   protected Script()
+   {
+      // for jpa
+   }
+   
+   protected Script(String fileName, String path)
+   {
+      this.name = fileName;
+      this.path = path;
+   }
+   
+   
+   public long getId()
+   {
+      return id;
+   }
+
+   public void setId(long id)
+   {
+      this.id = id;
+   }
+
+   public String getScriptFile()
+   {
+      return name;
+   }
+
+   public void setScriptFile(String scriptFile)
+   {
+      this.name = scriptFile;
+   }
+
+   
+
+   public String getName()
+   {
+      return name;
+   }
+
+   public void setName(String name)
+   {
+      this.name = name;
+   }
+
+   public String getPath()
+   {
+      return path;
+   }
+
+   public void setPath(String path)
+   {
+      this.path = path;
+   }
+
+   
+   
+   
+}

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageContext.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageContext.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageContext.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -43,10 +43,15 @@
 import org.jboss.ejb3.packagemanager.metadata.PackageType;
 import org.jboss.ejb3.packagemanager.metadata.PackagedDependency;
 import org.jboss.ejb3.packagemanager.metadata.PostInstallType;
+import org.jboss.ejb3.packagemanager.metadata.PostUnInstallType;
 import org.jboss.ejb3.packagemanager.metadata.PreInstallType;
-import org.jboss.ejb3.packagemanager.metadata.ScriptType;
+import org.jboss.ejb3.packagemanager.metadata.PreUnInstallType;
 import org.jboss.ejb3.packagemanager.metadata.SystemRequirementsType;
 import org.jboss.ejb3.packagemanager.metadata.UnProcessedDependenciesType;
+import org.jboss.ejb3.packagemanager.metadata.impl.PostInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PostUnInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PreInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PreUninstallScript;
 import org.jboss.ejb3.packagemanager.retriever.PackageRetriever;
 import org.jboss.ejb3.packagemanager.retriever.impl.PackageRetrievalFactory;
 import org.jboss.ejb3.packagemanager.util.IOUtil;
@@ -127,7 +132,6 @@
       return this.packageRoot;
    }
 
-   
    public PackageType getPackage()
    {
       return this.pkg;
@@ -142,7 +146,7 @@
       return this.dependencyPackages;
 
    }
-   
+
    /**
     * @see org.jboss.ejb3.packagemanager.PackageContext#getInstallationFiles()
     */
@@ -174,34 +178,34 @@
     * @see org.jboss.ejb3.packagemanager.PackageContext#getPostInstallScripts()
     */
    @Override
-   public List<ScriptType> getPostInstallScripts()
+   public List<PostInstallScript> getPostInstallScripts()
    {
       PostInstallType postInstall = this.pkg.getPostInstall();
       if (postInstall == null)
       {
          return Collections.EMPTY_LIST;
       }
-      List<ScriptType> postInstallScripts = postInstall.getScripts();
+      List<PostInstallScript> postInstallScripts = postInstall.getScripts();
       if (postInstallScripts == null)
       {
          return Collections.EMPTY_LIST;
       }
       return Collections.unmodifiableList(postInstallScripts);
-      
+
    }
 
    /**
     * @see org.jboss.ejb3.packagemanager.PackageContext#getPreInstallScripts()
     */
    @Override
-   public List<ScriptType> getPreInstallScripts()
+   public List<PreInstallScript> getPreInstallScripts()
    {
       PreInstallType preInstall = this.pkg.getPreInstall();
       if (preInstall == null)
       {
          return Collections.EMPTY_LIST;
       }
-      List<ScriptType> preInstallScripts = preInstall.getScripts();
+      List<PreInstallScript> preInstallScripts = preInstall.getScripts();
       if (preInstallScripts == null)
       {
          return Collections.EMPTY_LIST;
@@ -210,6 +214,44 @@
    }
 
    /**
+    * @see org.jboss.ejb3.packagemanager.PackageContext#getPostUnInstallScripts()
+    */
+   @Override
+   public List<PostUnInstallScript> getPostUnInstallScripts()
+   {
+      PostUnInstallType postUnInstall = this.pkg.getPostUninstall();
+      if (postUnInstall == null)
+      {
+         return Collections.EMPTY_LIST;
+      }
+      List<PostUnInstallScript> postUnInstallScripts = postUnInstall.getScripts();
+      if (postUnInstallScripts == null)
+      {
+         return Collections.EMPTY_LIST;
+      }
+      return Collections.unmodifiableList(postUnInstallScripts);
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.PackageContext#getPreUnInstallScripts()
+    */
+   @Override
+   public List<PreUninstallScript> getPreUnInstallScripts()
+   {
+      PreUnInstallType preUnInstall = this.pkg.getPreUninstall();
+      if (preUnInstall == null)
+      {
+         return Collections.EMPTY_LIST;
+      }
+      List<PreUninstallScript> preUnInstallScripts = preUnInstall.getScripts();
+      if (preUnInstallScripts == null)
+      {
+         return Collections.EMPTY_LIST;
+      }
+      return Collections.unmodifiableList(preUnInstallScripts);
+   }
+
+   /**
     * @see org.jboss.ejb3.packagemanager.PackageContext#getSystemRequirements()
     */
    @Override
@@ -218,6 +260,7 @@
       return this.pkg.getSystemRequirements();
    }
 
+   
    private void initPackageDependencies() throws DependencyResoultionException, InvalidPackageException
    {
       // packaged dependencies

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageManagerContext.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageManagerContext.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageManagerContext.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -21,9 +21,13 @@
 */
 package org.jboss.ejb3.packagemanager.impl;
 
+import java.io.File;
+
+import org.jboss.ejb3.packagemanager.PackageContext;
 import org.jboss.ejb3.packagemanager.PackageManager;
 import org.jboss.ejb3.packagemanager.PackageManagerContext;
 import org.jboss.ejb3.packagemanager.PackageManagerEnvironment;
+import org.jboss.ejb3.packagemanager.metadata.ScriptType;
 
 /**
  * DefaultPackageManagerContext
@@ -67,4 +71,16 @@
       return this.pkgMgr.getPackageManagerEnvironment();
    }
 
+   /**
+    * @see org.jboss.ejb3.packagemanager.PackageManagerContext#getScriptStoreLocation(org.jboss.ejb3.packagemanager.PackageContext)
+    */
+   @Override
+   public String getScriptStoreLocation(PackageContext pkgContext)
+   {
+      String packageName = pkgContext.getPackageName();
+      return "data/scripts/" + packageName;
+   }
+
+   
+
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageManagerImpl.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageManagerImpl.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/impl/DefaultPackageManagerImpl.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -22,15 +22,21 @@
 package org.jboss.ejb3.packagemanager.impl;
 
 import java.io.File;
+import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.List;
 import java.util.Set;
 
+import javax.transaction.Synchronization;
+import javax.transaction.TransactionManager;
+
 import org.jboss.ejb3.packagemanager.PackageContext;
 import org.jboss.ejb3.packagemanager.PackageManager;
 import org.jboss.ejb3.packagemanager.PackageManagerContext;
 import org.jboss.ejb3.packagemanager.PackageManagerEnvironment;
+import org.jboss.ejb3.packagemanager.annotation.TransactionAttribute;
+import org.jboss.ejb3.packagemanager.annotation.TransactionAttributeType;
 import org.jboss.ejb3.packagemanager.db.DefaultDatabaseManager;
 import org.jboss.ejb3.packagemanager.db.PackageDatabaseManager;
 import org.jboss.ejb3.packagemanager.entity.InstalledFile;
@@ -45,8 +51,14 @@
 import org.jboss.ejb3.packagemanager.metadata.PackagedDependency;
 import org.jboss.ejb3.packagemanager.metadata.ScriptType;
 import org.jboss.ejb3.packagemanager.metadata.UnProcessedDependenciesType;
+import org.jboss.ejb3.packagemanager.metadata.impl.PostInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PostUnInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PreInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PreUninstallScript;
 import org.jboss.ejb3.packagemanager.script.ScriptProcessor;
 import org.jboss.ejb3.packagemanager.script.impl.AntScriptProcessor;
+import org.jboss.ejb3.packagemanager.tx.TransactionManagerImpl;
+import org.jboss.ejb3.packagemanager.util.IOUtil;
 import org.jboss.logging.Logger;
 
 /**
@@ -55,7 +67,7 @@
  * @author Jaikiran Pai
  * @version $Revision: $
  */
-public class DefaultPackageManagerImpl implements PackageManager
+public class DefaultPackageManagerImpl implements PackageManager, Synchronization
 {
 
    /**
@@ -85,6 +97,11 @@
    private PackageDatabaseManager pkgDatabaseManager;
 
    /**
+    * Transaction manager
+    */
+   private TransactionManager transactionManager;
+
+   /**
     * Creates the default package manager for a server 
     * 
     * @param environment The package manager environment
@@ -95,7 +112,7 @@
       this.environment = environment;
       this.installationServerHome = jbossHome;
       this.pkgMgrCtx = new DefaultPackageManagerContext(this);
-      
+      this.transactionManager = TransactionManagerImpl.getInstance();
       this.pkgDatabaseManager = new DefaultDatabaseManager(this.pkgMgrCtx);
    }
 
@@ -123,6 +140,7 @@
     * @see org.jboss.ejb3.packagemanager.PackageManager#installPackage(java.lang.String)
     */
    @Override
+   @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    public void installPackage(String pkgPath) throws PackageManagerException
    {
       if (pkgPath == null)
@@ -150,6 +168,7 @@
     * 
     */
    @Override
+   @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    public void installPackage(URL packageURL) throws PackageManagerException
    {
       if (packageURL == null)
@@ -168,12 +187,14 @@
     * @param pkgContext
     * @throws PackageManagerException
     */
+   @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    public void installPackage(PackageContext pkgContext) throws PackageManagerException
    {
       if (pkgContext == null)
       {
          throw new PackageManagerException("Package context is null");
       }
+
       // check if package is already installed
       boolean packageAlreadyInstalled = this.pkgDatabaseManager.isPackageInstalled(pkgContext.getPackageName());
       if (packageAlreadyInstalled)
@@ -202,6 +223,10 @@
       }
       // post-installation step
       this.postInstallPackage(pkgContext);
+      // store the pre/post uninstall scripts (if any) at a particular location
+      // so that they can be used during uninstallation of this package
+      this.storeScripts(pkgContext);
+      // now record the installation into DB
       this.pkgDatabaseManager.installPackage(pkgContext);
       logger.info("Installed " + pkgContext);
    }
@@ -210,6 +235,7 @@
     * @see org.jboss.ejb3.packagemanager.PackageManager#removePackage(java.lang.String)
     */
    @Override
+   @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    public void removePackage(String packageName) throws PackageNotInstalledException, PackageManagerException
    {
       // get the installed package
@@ -219,8 +245,9 @@
          throw new PackageNotInstalledException("Package " + packageName + " is not installed - so cannot be removed!");
       }
       InstalledPackage installedPackage = this.pkgDatabaseManager.getInstalledPackage(packageName);
+
       this.removePackage(installedPackage, false);
-      
+
    }
 
    protected void removePackage(InstalledPackage installedPackage, boolean forceRemove)
@@ -238,6 +265,8 @@
                   + " - cannot remove this package!");
          }
       }
+      // pre-uninstall step
+      this.preUnInstallPackage(installedPackage);
       // TODO : Revisit this installer creation
       Installer installer = new DefaultInstaller(this.pkgMgrCtx);
       // install files in this package
@@ -245,6 +274,8 @@
       {
          installer.uninstall(installedPackage, fileToUninstall);
       }
+      // post-uninstall step
+      this.postUnInstallPackage(installedPackage);
       this.pkgDatabaseManager.removePackage(installedPackage);
       logger.info("Uninstalled " + packageName);
    }
@@ -253,6 +284,7 @@
     * @see org.jboss.ejb3.packagemanager.PackageManager#updatePackage(java.lang.String)
     */
    @Override
+   @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    public void updatePackage(String packageFilePath) throws PackageManagerException
    {
       if (packageFilePath == null)
@@ -272,6 +304,7 @@
    }
 
    @Override
+   @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    public void updatePackage(URL packageURL) throws PackageManagerException
    {
       if (packageURL == null)
@@ -284,6 +317,7 @@
       this.updatePackage(pkgCtx);
    }
 
+   @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    public void updatePackage(PackageContext pkgContext) throws PackageManagerException
    {
       String packageName = pkgContext.getPackageName();
@@ -295,13 +329,21 @@
                + " for upgrading to " + pkgContext);
          removePackage(installedPackage, true);
       }
-
       // now install new version
       this.installPackage(pkgContext);
-      
+
    }
 
    /**
+    * @see org.jboss.ejb3.packagemanager.PackageManager#getTransactionManager()
+    */
+   @Override
+   public TransactionManager getTransactionManager()
+   {
+      return this.transactionManager;
+   }
+
+   /**
     * Parses the {@code pkgPath} string and returns an appropriate URL.
     * 
     * @param pkgPath 
@@ -344,6 +386,82 @@
    }
 
    /**
+    * Stores the scripts available in a package to a local store so 
+    * that they are available during uninstallation of the package.
+    * Currently, only post-uninstall and pre-uinstall scripts are 
+    * stored because the rest of the scripts are not required 
+    * after installation of a package.
+    * 
+    * @param pkgCtx Package whose scripts are to be stored
+    */
+   private void storeScripts(PackageContext pkgCtx) throws PackageManagerException
+   {
+      String relativePathToScriptStoreDir = this.pkgMgrCtx.getScriptStoreLocation(pkgCtx);
+      File scriptStoreDir = new File(this.getPackageManagerEnvironment().getPackageManagerHome(),
+            relativePathToScriptStoreDir);
+      if (!scriptStoreDir.exists())
+      {
+         scriptStoreDir.mkdirs();
+      }
+      logger.debug("Scripts for " + pkgCtx + " will be stored in " + scriptStoreDir);
+      // we store only uninstall scripts.
+
+      // post-uninstall
+      List<PostUnInstallScript> postUnInstallScripts = pkgCtx.getPostUnInstallScripts();
+      if (postUnInstallScripts != null)
+      {
+         for (PostUnInstallScript script : postUnInstallScripts)
+         {
+            storeScript(pkgCtx, script, scriptStoreDir);
+
+         }
+      }
+      // pre-uninstall
+      List<PreUninstallScript> preUnInstallScripts = pkgCtx.getPreUnInstallScripts();
+      if (preUnInstallScripts != null)
+      {
+         for (PreUninstallScript script : preUnInstallScripts)
+         {
+            storeScript(pkgCtx, script, scriptStoreDir);
+         }
+      }
+   }
+
+   /**
+    * Stores the script to the <code>destDir</code>
+    * 
+    * @param pkgCtx Package to which this script belongs
+    * @param script Script to be stored
+    * @param destDir The destination directory where the script has to be stored
+    * @throws PackageManagerException
+    */
+   private void storeScript(PackageContext pkgCtx, ScriptType script, File destDir) throws PackageManagerException
+   {
+      String scriptFileName = script.getName();
+      File root = pkgCtx.getPackageRoot();
+      File path = root;
+      if (script.getPath() != null)
+      {
+         path = new File(root, script.getPath());
+      }
+      File scriptFile = new File(path, scriptFileName);
+      if (!scriptFile.exists())
+      {
+         throw new PackageManagerException("Script file " + scriptFile + " for " + pkgCtx + " does not exist!");
+      }
+      try
+      {
+         File destFile = new File(destDir, scriptFile.getName());
+         IOUtil.copy(scriptFile, destFile);
+         logger.debug("Stored script file " + scriptFile + " at " + destDir);
+      }
+      catch (IOException e)
+      {
+         throw new PackageManagerException("Could not store script due to exception ", e);
+      }
+   }
+
+   /**
     * The pre-installation step for packages. Each package can have multiple 
     * pre-install scripts to be run. This method runs those pre-install scripts
     * 
@@ -354,23 +472,69 @@
    protected void preInstallPackage(PackageContext pkgCtx) throws PackageManagerException
    {
       // find any pre-install scripts
-      List<ScriptType> preInstallScripts = pkgCtx.getPreInstallScripts();
+      List<PreInstallScript> preInstallScripts = pkgCtx.getPreInstallScripts();
       if (preInstallScripts == null || preInstallScripts.isEmpty())
       {
-         logger.debug("There are no pre-install scripts for " + pkgCtx);
+         logger.trace("There are no pre-install scripts for " + pkgCtx);
          return;
       }
-      for (ScriptType script : preInstallScripts)
+      for (PreInstallScript script : preInstallScripts)
       {
          // TODO: Can we just have one instance of the script processor to process
          // all scripts? Stateful/stateless?
          ScriptProcessor scriptProcessor = new AntScriptProcessor();
-         scriptProcessor.processScript(this.pkgMgrCtx, pkgCtx, script);
+         String scriptFileName = script.getName();
+         File root = pkgCtx.getPackageRoot();
+         File path = root;
+         if (script.getPath() != null)
+         {
+            path = new File(root, script.getPath());
+         }
+         File scriptFile = new File(path, scriptFileName);
+         if (!scriptFile.exists())
+         {
+            throw new PackageManagerException("Script file " + scriptFile + " for " + pkgCtx + " does not exist!");
+         }
+         scriptProcessor.processPreInstallScript(this.pkgMgrCtx, pkgCtx, scriptFile);
       }
 
    }
 
    /**
+    * The pre-uninstallation step for packages. Each package can have multiple 
+    * pre-uninstall scripts to be run. This method runs those pre-uninstall scripts
+    * 
+    * @param installedPackage The installed package
+    * @throws PackageManagerException If any exception occurs during pre-uninstallation of the 
+    * package
+    */
+   protected void preUnInstallPackage(InstalledPackage installedPackage) throws PackageManagerException
+   {
+      // find any pre-uninstall scripts
+      Set<org.jboss.ejb3.packagemanager.entity.PreUnInstallScript> preUnInstallScripts = installedPackage
+            .getPreUnInstallScripts();
+      if (preUnInstallScripts == null || preUnInstallScripts.isEmpty())
+      {
+         logger.trace("There are no pre-uninstall scripts for package " + installedPackage.getPackageName());
+         return;
+      }
+      for (org.jboss.ejb3.packagemanager.entity.PreUnInstallScript script : preUnInstallScripts)
+      {
+         ScriptProcessor scriptProcessor = new AntScriptProcessor();
+         File packageManagerHome = this.pkgMgrCtx.getPackageManagerEnvironment().getPackageManagerHome();
+         File scriptFileLocation = new File(packageManagerHome, script.getPath());
+         File scriptFile = new File(scriptFileLocation, script.getName());
+         if (!scriptFile.exists())
+         {
+            throw new PackageManagerException("Script file " + scriptFile + " for package "
+                  + installedPackage.getPackageName() + " does not exist!");
+         }
+         scriptProcessor.processPreUnInstallScript(this.pkgMgrCtx, installedPackage, scriptFile);
+      }
+
+   }
+
+   /**
     * The post-installation step for packages. Each package can have multiple 
     * post-install scripts to be run. This method runs those post-install scripts
     * 
@@ -381,23 +545,68 @@
    protected void postInstallPackage(PackageContext pkgCtx) throws PackageManagerException
    {
       // find any post-install scripts
-      List<ScriptType> postInstallScripts = pkgCtx.getPostInstallScripts();
+      List<PostInstallScript> postInstallScripts = pkgCtx.getPostInstallScripts();
       if (postInstallScripts == null || postInstallScripts.isEmpty())
       {
-         logger.debug("There are no post-install scripts for " + pkgCtx);
+         logger.trace("There are no post-install scripts for " + pkgCtx);
          return;
       }
-      for (ScriptType script : postInstallScripts)
+      for (PostInstallScript script : postInstallScripts)
       {
          ScriptProcessor scriptProcessor = new AntScriptProcessor();
          // TODO: Can we just have one instance of the script processor to process
          // all scripts? Stateful/stateless?
-         scriptProcessor.processScript(this.pkgMgrCtx, pkgCtx, script);
+         String scriptFileName = script.getName();
+         File root = pkgCtx.getPackageRoot();
+         File path = root;
+         if (script.getPath() != null)
+         {
+            path = new File(root, script.getPath());
+         }
+         File scriptFile = new File(path, scriptFileName);
+         if (!scriptFile.exists())
+         {
+            throw new PackageManagerException("Script file " + scriptFile + " for " + pkgCtx + " does not exist!");
+         }
+         scriptProcessor.processPostInstallScript(this.pkgMgrCtx, pkgCtx, scriptFile);
 
       }
    }
 
    /**
+    * The post-uninstallation step for packages. Each package can have multiple 
+    * post-uninstall scripts to be run. This method runs those post-uninstall scripts
+    * 
+    * @param installedPackage The installed package
+    * @throws PackageManagerException If any exception occurs during post-uninstallation of the 
+    * package
+    */
+   protected void postUnInstallPackage(InstalledPackage installedPackage) throws PackageManagerException
+   {
+      // find any post-uninstall scripts
+      Set<org.jboss.ejb3.packagemanager.entity.PostUnInstallScript> postUnInstallScripts = installedPackage
+            .getPostUnInstallScripts();
+      if (postUnInstallScripts == null || postUnInstallScripts.isEmpty())
+      {
+         logger.trace("There are no post-uninstall scripts for package " + installedPackage.getPackageName());
+         return;
+      }
+      for (org.jboss.ejb3.packagemanager.entity.PostUnInstallScript script : postUnInstallScripts)
+      {
+         ScriptProcessor scriptProcessor = new AntScriptProcessor();
+         File packageManagerHome = this.pkgMgrCtx.getPackageManagerEnvironment().getPackageManagerHome();
+         File scriptFileLocation = new File(packageManagerHome, script.getPath());
+         File scriptFile = new File(scriptFileLocation, script.getName());
+         if (!scriptFile.exists())
+         {
+            throw new PackageManagerException("Script file " + scriptFile + " for package "
+                  + installedPackage.getPackageName() + " does not exist!");
+         }
+         scriptProcessor.processPostUnInstallScript(this.pkgMgrCtx, installedPackage, scriptFile);
+      }
+   }
+
+   /**
     * Process any dependencies listed for the package. Dependency processing
     * will include resolving and retrieving the appropriate dependency packages
     * and install those packages. Dependency packages, either in the form of {@link PackagedDependency}
@@ -418,4 +627,32 @@
       }
    }
 
+   /**
+    * @see javax.transaction.Synchronization#afterCompletion(int)
+    */
+   @Override
+   public void afterCompletion(int status)
+   {
+      if (this.pkgDatabaseManager instanceof Synchronization)
+      {
+         Synchronization dbManager = (Synchronization) this.pkgDatabaseManager;
+         dbManager.afterCompletion(status);
+      }
+
+   }
+
+   /**
+    * @see javax.transaction.Synchronization#beforeCompletion()
+    */
+   @Override
+   public void beforeCompletion()
+   {
+      if (this.pkgDatabaseManager instanceof Synchronization)
+      {
+         Synchronization dbManager = (Synchronization) this.pkgDatabaseManager;
+         dbManager.beforeCompletion();
+      }
+
+   }
+
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/installer/AbstractInstaller.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/installer/AbstractInstaller.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/installer/AbstractInstaller.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -58,6 +58,7 @@
       String jbossHome = pkg.getPackageManager().getJbossHome();
       File relativePathToFile = new File(jbossHome, installedFile.getInstalledPath());
       File fileToUninstall = new File(relativePathToFile, installedFile.getFileName());
+      
       if (!fileToUninstall.exists())
       {
          throw new PackageManagerException("Installed file missing: " + fileToUninstall.getAbsolutePath()

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/main/Main.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/main/Main.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/main/Main.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -31,6 +31,7 @@
 
 import org.jboss.ejb3.packagemanager.PackageManager;
 import org.jboss.ejb3.packagemanager.PackageManagerEnvironment;
+import org.jboss.ejb3.packagemanager.PackageManagerFactory;
 import org.jboss.ejb3.packagemanager.exception.PackageManagerException;
 import org.jboss.ejb3.packagemanager.impl.DefaultPackageManagerImpl;
 import org.jboss.ejb3.packagemanager.util.DBUtil;
@@ -108,7 +109,7 @@
       logger.info("Using Package Manager Home: " + packageManagerHome);
       logger.info("Using JBoss Home: " + jbossHome);
       PackageManagerEnvironment env = new PackageManagerEnvironment(packageManagerHome);
-      PackageManager pm = new DefaultPackageManagerImpl(env, jbossHome);
+      PackageManager pm = PackageManagerFactory.getDefaultPackageManager(env, jbossHome);
 
       String schemaSetupScript = (String) cmdLineParser.getOptionValue(setupCmdOption);
       if (schemaSetupScript != null)
@@ -175,7 +176,7 @@
          // out you go!
          pm.removePackage(packageToRemove);
       }
-
+      
    }
 
    

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PackageInstallationPhase.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PackageInstallationPhase.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PackageInstallationPhase.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -25,7 +25,7 @@
  * PackageInstallationPhase
  * 
  * Represents a phase during package installation.
- * Possible phases are pre-install and post-install
+ * 
  *
  * @author Jaikiran Pai
  * @version $Revision: $
@@ -33,5 +33,7 @@
 public enum PackageInstallationPhase 
 {
    PRE_INSTALL,
-   POST_INSTALL
+   POST_INSTALL,
+   PRE_UNINSTALL,
+   POST_UNINSTALL
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PackageType.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PackageType.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PackageType.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -144,4 +144,29 @@
     * @param postInstall Post-install 
     */
    void setPostInstall(PostInstallType postInstall);
+   
+   /**
+    * Returns any pre-uninstall metadata related to this package
+    * @return
+    */
+   PreUnInstallType getPreUninstall();
+   
+   /**
+    * Sets the pre-uninstall metadata for this package
+    * @param preUninstall
+    */
+   void setPreUnInstall(PreUnInstallType preUninstall);
+   
+   /**
+    * Returns any post-uninstall metadata related to this package
+    * @return
+    */
+   PostUnInstallType getPostUninstall();
+   
+   /**
+    * Sets the post-uninstall metadata for this package
+    * @param preUninstall
+    */
+   void setPostUnInstall(PostUnInstallType postUninstall);
+
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PostInstallType.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PostInstallType.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PostInstallType.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -23,6 +23,8 @@
 
 import java.util.List;
 
+import org.jboss.ejb3.packagemanager.metadata.impl.PostInstallScript;
+
 /**
  * PostInstallMetadata
  *
@@ -40,21 +42,21 @@
     * 
     * @return
     */
-   List<ScriptType> getScripts();
+   List<PostInstallScript> getScripts();
 
    /**
     * Sets the list of post-install scripts for a package
     * 
     * @param scripts The post-install scripts
     */
-   void setScripts(List<ScriptType> scripts);
+   void setScripts(List<PostInstallScript> scripts);
 
    /**
-    * Adds a pre-install script to the list of post-install scripts 
+    * Adds a post-install script to the list of post-install scripts 
     * for this package
     * @param script
     */
-   void addScript(ScriptType script);
+   void addScript(PostInstallScript script);
 
    /**
     * Returns the package to which this post-install step

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PostUnInstallType.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PostUnInstallType.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PostUnInstallType.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,64 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.metadata;
+
+import java.util.List;
+
+import org.jboss.ejb3.packagemanager.metadata.impl.PostUnInstallScript;
+
+/**
+ * PostUnInstallType
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public interface PostUnInstallType
+{
+
+   /**
+    * Returns the list of post-uninstall scripts for a package
+    * 
+    * @return
+    */
+   List<PostUnInstallScript> getScripts();
+
+   /**
+    * Sets the list of post-uninstall scripts for a package
+    * 
+    * @param scripts The post-uninstall scripts
+    */
+   void setScripts(List<PostUnInstallScript> scripts);
+
+   /**
+    * Adds a post-uninstall script to the list of post-uninstall scripts 
+    * for this package
+    * @param script
+    */
+   void addScript(PostUnInstallScript script);
+
+   /**
+    * Returns the package to which this post-uninstall step
+    * belongs to
+    * @return
+    */
+   PackageType getPackage();
+}

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PreInstallType.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PreInstallType.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PreInstallType.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -23,6 +23,8 @@
 
 import java.util.List;
 
+import org.jboss.ejb3.packagemanager.metadata.impl.PreInstallScript;
+
 /**
  * PreInstallMetadata
  * 
@@ -42,21 +44,21 @@
     * 
     * @return
     */
-   List<ScriptType> getScripts();
+   List<PreInstallScript> getScripts();
    
    /**
     * Sets the list of pre-install scripts for a package
     * 
     * @param scripts The pre-install scripts
     */ 
-   void setScripts(List<ScriptType> scripts);
+   void setScripts(List<PreInstallScript> scripts);
    
    /**
     * Adds a pre-install script to the list of pre-install scripts 
     * for this package
     * @param script
     */
-   void addScript(ScriptType script);
+   void addScript(PreInstallScript script);
    
    /**
     * Returns the package to which this pre-install step

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PreUnInstallType.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PreUnInstallType.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/PreUnInstallType.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,63 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.metadata;
+
+import java.util.List;
+
+import org.jboss.ejb3.packagemanager.metadata.impl.PreUninstallScript;
+
+/**
+ * PreUnInstallType
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public interface PreUnInstallType
+{
+   /**
+    * Returns the list of pre-uninstall scripts for a package
+    * 
+    * @return
+    */
+   List<PreUninstallScript> getScripts();
+
+   /**
+    * Sets the list of pre-uninstall scripts for a package
+    * 
+    * @param scripts The pre-uninstall scripts
+    */
+   void setScripts(List<PreUninstallScript> scripts);
+
+   /**
+    * Adds a pre-uninstall script to the list of pre-uninstall scripts 
+    * for this package
+    * @param script
+    */
+   void addScript(PreUninstallScript script);
+
+   /**
+    * Returns the package to which this pre-uninstall step
+    * belongs to
+    * @return
+    */
+   PackageType getPackage();
+}

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/ScriptType.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/ScriptType.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/ScriptType.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -21,7 +21,10 @@
 */
 package org.jboss.ejb3.packagemanager.metadata;
 
+import org.jboss.ejb3.packagemanager.metadata.impl.PostUnInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PreUninstallScript;
 
+
 /**
  * ScriptMetadata
  *
@@ -35,41 +38,47 @@
 {
 
    /**
-    * Returns the file path (including the file name) relative to 
-    * the location of the package.xml in the package 
+    * Returns the name of the file
     * @return
     */
-   String getFile();
+   String getName();
    
    /**
-    * Sets the file path (including the name of the file)
+    * Sets the name of the file
     * 
-    * @param scriptFile Path relative to the location of package.xml in the package 
+    * @param name Name of the script file 
     */
-   void setFile(String scriptFile);
+   void setName(String name);
    
-//   /**
-//    * Returns the fully qualified name of the class which implements
-//    * {@link ScriptProcessor} and is responsible for processing the 
-//    * {@link #getFile()} script file
-//    * @return
-//    */
-//   String getProcessor();
-//   
-//   /**
-//    * Sets the script processor which is responsible for processing the
-//    * {@link #getFile()} script file
-//    * 
-//    * @param scriptProcessor Fully qualified name of the class which implements
-//    *   {@link ScriptProcessor} 
-//    */
-//   void setProcessor(String scriptProcessor);
+   /**
+    * Sets the path of this script file.
+    * @param path
+    */
+   void setPath(String path);
    
    /**
+    * Returns the path of this script file. Path is relative to
+    * the location of package.xml of the package to which this
+    * script belongs
+    * @return
+    */
+   String getPath();
+   
+   /**
     * Returns the package installation phase, during which this script
     * is expected to be executed
     *  
     * @return
     */
    PackageInstallationPhase getScriptExecutionPhase();
+   
+   /**
+    * Returns true, if the script has to be stored, during installation, to some
+    * location (usually within the package manager home), so that
+    * the script is available for use during uninstallation of the package.
+    * 
+    * Uninstall scripts (pre-uninstall and post-uninstall) are by default persisted
+    * @return
+    */
+   boolean isPersistent();
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PackageImpl.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PackageImpl.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PackageImpl.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -28,7 +28,9 @@
 import org.jboss.ejb3.packagemanager.metadata.InstallFileType;
 import org.jboss.ejb3.packagemanager.metadata.PackageType;
 import org.jboss.ejb3.packagemanager.metadata.PostInstallType;
+import org.jboss.ejb3.packagemanager.metadata.PostUnInstallType;
 import org.jboss.ejb3.packagemanager.metadata.PreInstallType;
+import org.jboss.ejb3.packagemanager.metadata.PreUnInstallType;
 import org.jboss.ejb3.packagemanager.metadata.SystemRequirementsType;
 
 public class PackageImpl implements PackageType
@@ -54,6 +56,16 @@
     */
    protected PreInstallType preInstall;
 
+   /**
+    * Post-UnInstall
+    */
+   protected PostUnInstallType postUnInstall;
+
+   /**
+    * Pre-Uninstall
+    */
+   protected PreUnInstallType preUnInstall;
+
    public PackageImpl()
    {
 
@@ -164,4 +176,42 @@
 
    }
 
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PackageType#getPostUninstall()
+    */
+   @Override
+   public PostUnInstallType getPostUninstall()
+   {
+      return this.postUnInstall;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PackageType#getPreUninstall()
+    */
+   @Override
+   public PreUnInstallType getPreUninstall()
+   {
+      return this.preUnInstall;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PackageType#setPostUnInstall(org.jboss.ejb3.packagemanager.metadata.PostUnInstallType)
+    */
+   @Override
+   public void setPostUnInstall(PostUnInstallType postUninstall)
+   {
+      this.postUnInstall = postUninstall;
+
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PackageType#setPreUnInstall(org.jboss.ejb3.packagemanager.metadata.PreUnInstallType)
+    */
+   @Override
+   public void setPreUnInstall(PreUnInstallType preUninstall)
+   {
+      this.preUnInstall = preUninstall;
+
+   }
+
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostInstallImpl.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostInstallImpl.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostInstallImpl.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -26,7 +26,6 @@
 
 import org.jboss.ejb3.packagemanager.metadata.PackageType;
 import org.jboss.ejb3.packagemanager.metadata.PostInstallType;
-import org.jboss.ejb3.packagemanager.metadata.ScriptType;
 
 /**
  * PostInstallMetadataImpl
@@ -45,7 +44,7 @@
    /**
     * post-install scripts
     */
-   private List<ScriptType> scripts;
+   private List<PostInstallScript> scripts;
 
    /**
     * Constructor
@@ -57,9 +56,9 @@
    }
 
    /**
-    * @see org.jboss.ejb3.packagemanager.metadata.PostInstallType#addScript(org.jboss.ejb3.packagemanager.metadata.ScriptType)
+    * @see org.jboss.ejb3.packagemanager.metadata.PostInstallType#addScript(PostInstallScript)
     */
-   public void addScript(ScriptType script)
+   public void addScript(PostInstallScript script)
    {
       if (script == null)
       {
@@ -67,7 +66,7 @@
       }
       if (this.scripts == null)
       {
-         this.scripts = new ArrayList<ScriptType>();
+         this.scripts = new ArrayList<PostInstallScript>();
       }
       this.scripts.add(script);
 
@@ -84,7 +83,7 @@
    /**
     * @see org.jboss.ejb3.packagemanager.metadata.PostInstallType#getScripts()
     */
-   public List<ScriptType> getScripts()
+   public List<PostInstallScript> getScripts()
    {
       return this.scripts;
    }
@@ -92,7 +91,7 @@
    /**
     * @see org.jboss.ejb3.packagemanager.metadata.PostInstallType#setScripts(java.util.List)
     */
-   public void setScripts(List<ScriptType> scripts)
+   public void setScripts(List<PostInstallScript> scripts)
    {
       if (scripts == null)
       {

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostInstallScript.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostInstallScript.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostInstallScript.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -69,5 +69,15 @@
    {
       return this.postInstallMeta;
    }
+   
+   /**
+    * Post install scripts are not persistent
+    * @see org.jboss.ejb3.packagemanager.metadata.impl.ScriptImpl#isPersistent()
+    */
+   @Override
+   public boolean isPersistent()
+   {
+      return false;
+   }
 
 }

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostUnInstallImpl.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostUnInstallImpl.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostUnInstallImpl.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,102 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.metadata.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jboss.ejb3.packagemanager.metadata.PackageType;
+import org.jboss.ejb3.packagemanager.metadata.PostUnInstallType;
+
+/**
+ * PostUnInstallImpl
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class PostUnInstallImpl implements PostUnInstallType
+{
+   /**
+    * The package to which this post-uninstall belongs
+    */
+   private PackageType pkgMetadata;
+
+   /**
+    * post-install scripts
+    */
+   private List<PostUnInstallScript> scripts;
+
+   /**
+    * Constructor
+    * @param pkgMeta The {@link PackageType} to which this post-uninstall belongs
+    */
+   public PostUnInstallImpl(PackageType pkgMeta)
+   {
+      this.pkgMetadata = pkgMeta;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PostUnInstallType#addScript(PostUnInstallScript)
+    */
+   public void addScript(PostUnInstallScript script)
+   {
+      if (script == null)
+      {
+         return;
+      }
+      if (this.scripts == null)
+      {
+         this.scripts = new ArrayList<PostUnInstallScript>();
+      }
+      this.scripts.add(script);
+
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PostUnInstallType#getPackage()
+    */
+   public PackageType getPackage()
+   {
+      return this.pkgMetadata;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PostUnInstallType#getScripts()
+    */
+   public List<PostUnInstallScript> getScripts()
+   {
+      return this.scripts;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PostUnInstallType#setScripts(List)
+    */
+   public void setScripts(List<PostUnInstallScript> scripts)
+   {
+      if (scripts == null)
+      {
+         throw new IllegalArgumentException("post-uninstall scripts cannot be set to null scripts");
+      }
+      this.scripts = scripts;
+
+   }
+}

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostUnInstallScript.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostUnInstallScript.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PostUnInstallScript.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,82 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.metadata.impl;
+
+import org.jboss.ejb3.packagemanager.metadata.PackageInstallationPhase;
+import org.jboss.ejb3.packagemanager.metadata.PostUnInstallType;
+
+/**
+ * PostUnInstallScript
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class PostUnInstallScript extends ScriptImpl
+{
+
+   /**
+    * The post-uninstall step to which this script 
+    * belongs
+    */
+   private PostUnInstallType postUinstallMeta;
+
+   /**
+    * Constructor
+    * 
+    * @param postUnInstallMeta The {@link PostUnInstallType} to which this
+    * post-uninstall script belongs to
+    */
+   public PostUnInstallScript(PostUnInstallType postUninstall)
+   {
+      this.postUinstallMeta = postUninstall;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.impl.ScriptImpl#getScriptExecutionPhase()
+    */
+   @Override
+   public PackageInstallationPhase getScriptExecutionPhase()
+   {
+      return PackageInstallationPhase.POST_UNINSTALL;
+   }
+
+   /**
+    * Returns the {@link PostUnInstallType} to which this post-uninstall script
+    * belongs to
+    * 
+    * @return
+    */
+   public PostUnInstallType getPostUnInstallMetadata()
+   {
+      return this.postUinstallMeta;
+   }
+
+   /**
+    * Post uninstall scripts are persistent
+    * @see org.jboss.ejb3.packagemanager.metadata.impl.ScriptImpl#isPersistent()
+    */
+   @Override
+   public boolean isPersistent()
+   {
+      return true;
+   }
+}

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreInstallImpl.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreInstallImpl.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreInstallImpl.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -26,7 +26,6 @@
 
 import org.jboss.ejb3.packagemanager.metadata.PackageType;
 import org.jboss.ejb3.packagemanager.metadata.PreInstallType;
-import org.jboss.ejb3.packagemanager.metadata.ScriptType;
 
 /**
  * PreInstallMetadataImpl
@@ -45,7 +44,7 @@
    /**
     * pre-install scripts
     */
-   private List<ScriptType> scripts;
+   private List<PreInstallScript> scripts;
 
    /**
     * Constructor
@@ -57,9 +56,9 @@
    }
 
    /**
-    * @see org.jboss.ejb3.packagemanager.metadata.PreInstallType#addScript(org.jboss.ejb3.packagemanager.metadata.ScriptType)
+    * @see org.jboss.ejb3.packagemanager.metadata.PreInstallType#addScript(PreInstallScript)
     */
-   public void addScript(ScriptType script)
+   public void addScript(PreInstallScript script)
    {
       if (script == null)
       {
@@ -67,7 +66,7 @@
       }
       if (this.scripts == null)
       {
-         this.scripts = new ArrayList<ScriptType>();
+         this.scripts = new ArrayList<PreInstallScript>();
       }
       this.scripts.add(script);
    }
@@ -83,7 +82,7 @@
    /**
     * @see org.jboss.ejb3.packagemanager.metadata.PreInstallType#getScripts()
     */
-   public List<ScriptType> getScripts()
+   public List<PreInstallScript> getScripts()
    {
       return this.scripts;
    }
@@ -91,7 +90,7 @@
    /**
     * @see org.jboss.ejb3.packagemanager.metadata.PreInstallType#setScripts(java.util.List)
     */
-   public void setScripts(List<ScriptType> scripts)
+   public void setScripts(List<PreInstallScript> scripts)
    {
       if (scripts == null)
       {

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreInstallScript.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreInstallScript.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreInstallScript.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -68,5 +68,15 @@
    {
       return this.preInstallMeta;
    }
+   
+   /**
+    * Pre install scripts are not persistent
+    * @see org.jboss.ejb3.packagemanager.metadata.impl.ScriptImpl#isPersistent()
+    */
+   @Override
+   public boolean isPersistent()
+   {
+      return false;
+   }
 
 }

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreUnInstallImpl.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreUnInstallImpl.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreUnInstallImpl.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,101 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.metadata.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jboss.ejb3.packagemanager.metadata.PackageType;
+import org.jboss.ejb3.packagemanager.metadata.PreUnInstallType;
+
+/**
+ * PreUnInstallImpl
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class PreUnInstallImpl implements PreUnInstallType
+{
+   /**
+    * The package to which this pre-uninstall belongs
+    */
+   private PackageType pkgMetadata;
+
+   /**
+    * pre-install scripts
+    */
+   private List<PreUninstallScript> scripts;
+
+   /**
+    * Constructor
+    * @param pkgMeta The {@link PackageType} to which this pre-uninstall belongs
+    */
+   public PreUnInstallImpl(PackageType pkgMeta)
+   {
+      this.pkgMetadata = pkgMeta;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PreUnInstallType#addScript(PreUninstallScript)
+    */
+   public void addScript(PreUninstallScript script)
+   {
+      if (script == null)
+      {
+         return;
+      }
+      if (this.scripts == null)
+      {
+         this.scripts = new ArrayList<PreUninstallScript>();
+      }
+      this.scripts.add(script);
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PreUnInstallType#getPackage()
+    */
+   public PackageType getPackage()
+   {
+      return this.pkgMetadata;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PreUnInstallType#getScripts()
+    */
+   public List<PreUninstallScript> getScripts()
+   {
+      return this.scripts;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.PreUnInstallType#setScripts(List)
+    */
+   public void setScripts(List<PreUninstallScript> scripts)
+   {
+      if (scripts == null)
+      {
+         throw new IllegalArgumentException("pre-uninstall scripts cannot be set to null scripts");
+      }
+      this.scripts = scripts;
+
+   }
+}

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreUninstallScript.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreUninstallScript.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/PreUninstallScript.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,83 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.metadata.impl;
+
+import org.jboss.ejb3.packagemanager.metadata.PackageInstallationPhase;
+import org.jboss.ejb3.packagemanager.metadata.PostUnInstallType;
+import org.jboss.ejb3.packagemanager.metadata.PreUnInstallType;
+
+/**
+ * PreUninstallScript
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class PreUninstallScript extends ScriptImpl
+{
+
+   /**
+    * The pre-uninstall step to which this script 
+    * belongs
+    */
+   private PreUnInstallType preUninstallMeta;
+
+   /**
+    * Constructor
+    * 
+    * @param preUninstall The {@link PostUnInstallType} to which this
+    * pre-uninstall script belongs to
+    */
+   public PreUninstallScript(PreUnInstallType preUninstall)
+   {
+      this.preUninstallMeta = preUninstall;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.impl.ScriptImpl#getScriptExecutionPhase()
+    */
+   @Override
+   public PackageInstallationPhase getScriptExecutionPhase()
+   {
+      return PackageInstallationPhase.PRE_UNINSTALL;
+   }
+
+   /**
+    * Returns the {@link PreUnInstallType} to which this pre-uninstall script
+    * belongs to
+    * 
+    * @return
+    */
+   public PreUnInstallType getPreUnInstallMetadata()
+   {
+      return this.preUninstallMeta;
+   }
+   
+   /**
+    * Pre uninstall scripts are persistent
+    * @see org.jboss.ejb3.packagemanager.metadata.impl.ScriptImpl#isPersistent()
+    */
+   @Override
+   public boolean isPersistent()
+   {
+      return true;
+   }
+}

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/ScriptImpl.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/ScriptImpl.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/metadata/impl/ScriptImpl.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -34,33 +34,64 @@
 {
 
    /**
-    * The script file (default is package-script.xml)
+    * The script file name (default is package-script.xml)
     */
-   private String scriptFile = "package-script.xml";
+   private String scriptFileName = "package-script.xml";
 
    /**
-    * @see org.jboss.ejb3.packagemanager.metadata.ScriptType#getFile()
+    * Path to the script file. Path is relative to the location
+    * of package.xml of the package. A null value means this 
+    * script is at the same location as the package.xml
     */
-   public String getFile()
+   private String path;
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.ScriptType#getName()
+    */
+   public String getName()
    {
-      return this.scriptFile;
+      return this.scriptFileName;
    }
 
    /**
-    * @see org.jboss.ejb3.packagemanager.metadata.ScriptType#setFile(java.lang.String)
+    * @see org.jboss.ejb3.packagemanager.metadata.ScriptType#setName(String)
     */
-   public void setFile(String scriptFile)
+   public void setName(String name)
    {
-      if (scriptFile == null)
+      if (name == null)
       {
-         throw new IllegalArgumentException("Script file value cannot be null");
+         throw new IllegalArgumentException("Script file name cannot be null");
       }
-      this.scriptFile = scriptFile;
+      this.scriptFileName = name;
    }
 
    /**
+    * @see org.jboss.ejb3.packagemanager.metadata.ScriptType#getPath()
+    */
+   @Override
+   public String getPath()
+   {
+      return this.path;
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.ScriptType#setPath(java.lang.String)
+    */
+   @Override
+   public void setPath(String path)
+   {
+      this.path = path;
+
+   }
+
+   /**
     * @see org.jboss.ejb3.packagemanager.metadata.ScriptType#getScriptExecutionPhase()
     */
    public abstract PackageInstallationPhase getScriptExecutionPhase();
+   
+   /**
+    * @see org.jboss.ejb3.packagemanager.metadata.ScriptType#isPersistent()
+    */
+   public abstract boolean isPersistent();
 
 }

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/proxy/PackageManagerInvocationHandler.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/proxy/PackageManagerInvocationHandler.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/proxy/PackageManagerInvocationHandler.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,196 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.proxy;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+import org.jboss.ejb3.packagemanager.PackageManager;
+import org.jboss.ejb3.packagemanager.annotation.TransactionAttribute;
+import org.jboss.ejb3.packagemanager.annotation.TransactionAttributeType;
+import org.jboss.logging.Logger;
+
+/**
+ * PackageManagerInvocationHandler
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class PackageManagerInvocationHandler implements InvocationHandler
+{
+
+   private PackageManager packageManager;
+
+   private static Logger logger = Logger.getLogger(PackageManagerInvocationHandler.class);
+
+   public PackageManagerInvocationHandler(PackageManager packageManager)
+   {
+      this.packageManager = packageManager;
+   }
+
+   /**
+    * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
+    */
+   @Override
+   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
+   {
+      TransactionAttribute txAnnotation = this.getTxAttribute(method);
+      // nothing special to do, just invoke 
+      if (txAnnotation == null)
+      {
+         return method.invoke(this.packageManager, args);
+      }
+      TransactionAttributeType txType = txAnnotation.value();
+      switch (txType)
+      {
+         case REQUIRED :
+            return this.invokeInCurrentTx(proxy, method, args);
+         case REQUIRES_NEW :
+            return this.invokeInNewTx(proxy, method, args);
+         default :
+            throw new RuntimeException("Unknow tx type " + txType);
+      }
+   }
+
+   private Object invokeInCurrentTx(Object proxy, Method method, Object[] args) throws Throwable
+   {
+      TransactionManager txManager = this.packageManager.getTransactionManager();
+      Transaction currentTx = txManager.getTransaction();
+      boolean txInitiator = false;
+      if (currentTx == null)
+      {
+         // start new tx
+         txManager.begin();
+         logger.debug("Started in invocation handler " + txManager.getTransaction() + " for method " + method);
+         currentTx = txManager.getTransaction();
+         registerForSynchronization(txManager.getTransaction());
+         txInitiator = true;
+      }
+      try
+      {
+
+         Object result = method.invoke(this.packageManager, args);
+         if (txInitiator)
+         {
+            if (txManager.getStatus() == Status.STATUS_MARKED_ROLLBACK)
+            {
+               txManager.rollback();
+            }
+            else
+            {
+               logger.debug("Commiting in invocation handler " + txManager.getTransaction() + " for method " + method);
+               txManager.commit();
+               logger.debug("Commited in invocation handler " + txManager.getTransaction() + " for method " + method);
+            }
+
+         }
+         return result;
+      }
+      catch (InvocationTargetException ite)
+      {
+         Throwable cause = ite.getCause();
+         if (!txInitiator)
+         {
+            txManager.setRollbackOnly();
+         }
+         else
+         {
+            txManager.rollback();
+         }
+
+         throw cause;
+      }
+
+   }
+
+   private Object invokeInNewTx(Object proxy, Method method, Object[] args) throws Throwable
+   {
+      TransactionManager txManager = this.packageManager.getTransactionManager();
+      Transaction currentTx = txManager.getTransaction();
+      try
+      {
+         if (currentTx != null)
+         {
+            // suspend current tx
+            txManager.suspend();
+         }
+         // start new tx and invoke the method
+         txManager.begin();
+         Transaction newTx = txManager.getTransaction();
+         registerForSynchronization(newTx);
+         try
+         {
+            Object result = method.invoke(this.packageManager, args);
+            if (newTx.getStatus() == Status.STATUS_MARKED_ROLLBACK)
+            {
+               // rollback
+               newTx.rollback();
+            }
+            else
+            {
+               // method successfully completed, so commit tx
+               newTx.commit();
+            }
+            return result;
+         }
+         catch (InvocationTargetException ite)
+         {
+            Throwable cause = ite.getCause();
+            // rollback the tx in which this method was invoked
+            newTx.rollback();
+            throw cause;
+         }
+      }
+      finally
+      {
+         if (currentTx != null)
+         {
+            txManager.resume(currentTx);
+         }
+      }
+
+   }
+
+   private TransactionAttribute getTxAttribute(Method method) throws SecurityException, NoSuchMethodException
+   {
+      Method methodOnPackageManagerImpl = this.packageManager.getClass().getMethod(method.getName(),
+            method.getParameterTypes());
+      return methodOnPackageManagerImpl.getAnnotation(TransactionAttribute.class);
+   }
+
+   private void registerForSynchronization(Transaction tx) throws IllegalStateException, RollbackException,
+         SystemException
+   {
+      if (this.packageManager instanceof Synchronization)
+      {
+         tx.registerSynchronization((Synchronization) this.packageManager);
+      }
+   }
+}

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/script/ScriptProcessor.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/script/ScriptProcessor.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/script/ScriptProcessor.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -21,10 +21,12 @@
 */
 package org.jboss.ejb3.packagemanager.script;
 
+import java.io.File;
+
 import org.jboss.ejb3.packagemanager.PackageContext;
 import org.jboss.ejb3.packagemanager.PackageManagerContext;
+import org.jboss.ejb3.packagemanager.entity.InstalledPackage;
 import org.jboss.ejb3.packagemanager.exception.ScriptProcessingException;
-import org.jboss.ejb3.packagemanager.metadata.ScriptType;
 
 /**
  * ScriptProcessor
@@ -35,5 +37,11 @@
 public interface ScriptProcessor
 {
 
-   void processScript(PackageManagerContext pkgManagerCtx, PackageContext pkgCtx, ScriptType script) throws ScriptProcessingException;
+   void processPreInstallScript(PackageManagerContext pkgManagerCtx, PackageContext pkgCtx, File script) throws ScriptProcessingException;
+   
+   void processPostInstallScript(PackageManagerContext pkgManagerCtx, PackageContext pkgCtx, File script) throws ScriptProcessingException;
+   
+   void processPreUnInstallScript(PackageManagerContext pkgManagerCtx, InstalledPackage installedPackage, File script) throws ScriptProcessingException;
+   
+   void processPostUnInstallScript(PackageManagerContext pkgManagerCtx, InstalledPackage installedPackage, File script) throws ScriptProcessingException;
 }

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/script/impl/AntScriptProcessor.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/script/impl/AntScriptProcessor.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/script/impl/AntScriptProcessor.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -22,6 +22,10 @@
 package org.jboss.ejb3.packagemanager.script.impl;
 
 import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
 
 import org.apache.tools.ant.BuildEvent;
 import org.apache.tools.ant.BuildListener;
@@ -29,9 +33,9 @@
 import org.apache.tools.ant.ProjectHelper;
 import org.jboss.ejb3.packagemanager.PackageContext;
 import org.jboss.ejb3.packagemanager.PackageManagerContext;
+import org.jboss.ejb3.packagemanager.entity.InstalledPackage;
+import org.jboss.ejb3.packagemanager.entity.PackageManagerEntity;
 import org.jboss.ejb3.packagemanager.exception.ScriptProcessingException;
-import org.jboss.ejb3.packagemanager.metadata.PackageInstallationPhase;
-import org.jboss.ejb3.packagemanager.metadata.ScriptType;
 import org.jboss.ejb3.packagemanager.script.ScriptProcessor;
 import org.jboss.logging.Logger;
 
@@ -50,68 +54,130 @@
    private static Logger logger = Logger.getLogger(AntScriptProcessor.class);
 
    /**
-    * @see org.jboss.ejb3.packagemanager.script.ScriptProcessor#processScript(PackageManagerContext, PackageContext, ScriptType)
+    * @see org.jboss.ejb3.packagemanager.script.ScriptProcessor#processPostInstallScript(org.jboss.ejb3.packagemanager.PackageManagerContext, org.jboss.ejb3.packagemanager.PackageContext, java.io.File)
     */
    @Override
-   public void processScript(PackageManagerContext pkgManagerCtx, PackageContext pkgCtx, ScriptType script)
+   public void processPostInstallScript(PackageManagerContext pkgManagerCtx, PackageContext pkgCtx, File script)
          throws ScriptProcessingException
    {
-      File root = pkgCtx.getPackageRoot();
-      File antBuildFile = new File(root, script.getFile());
-      if (!antBuildFile.exists())
+      // Set the properties JBOSS_HOME and PM_HOME for the 
+      // build scripts to use (if they find it necessary)
+      Map<String, String> props = new HashMap<String, String>();
+      props.put("JBOSS_HOME", pkgManagerCtx.getJBossServerHome());
+      props.put("PM_HOME", pkgManagerCtx.getPackageManagerEnvironment().getPackageManagerHome().getAbsolutePath());
+      Project antProject = this.buildProject(script, pkgCtx.getPackageRoot(), props);
+      this.runTarget(antProject, "post-install");
+      
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.script.ScriptProcessor#processPostUnInstallScript(PackageManagerContext, InstalledPackage, File)
+    */
+   @Override
+   public void processPostUnInstallScript(PackageManagerContext pkgManagerCtx, InstalledPackage installedPackage, File script)
+         throws ScriptProcessingException
+   {
+      // Set the properties JBOSS_HOME and PM_HOME for the 
+      // build scripts to use (if they find it necessary)
+      Map<String, String> props = new HashMap<String, String>();
+      props.put("JBOSS_HOME", pkgManagerCtx.getJBossServerHome());
+      props.put("PM_HOME", pkgManagerCtx.getPackageManagerEnvironment().getPackageManagerHome().getAbsolutePath());
+      
+      // TODO: What should basedir point to? Let's right now point it to the folder containing the
+      // script file
+      Project antProject = this.buildProject(script, script.getParentFile(), props);
+      this.runTarget(antProject, "post-uninstall");
+
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.script.ScriptProcessor#processPreInstallScript(org.jboss.ejb3.packagemanager.PackageManagerContext, org.jboss.ejb3.packagemanager.PackageContext, java.io.File)
+    */
+   @Override
+   public void processPreInstallScript(PackageManagerContext pkgManagerCtx, PackageContext pkgCtx, File script)
+         throws ScriptProcessingException
+   {
+      // Set the properties JBOSS_HOME and PM_HOME for the 
+      // build scripts to use (if they find it necessary)
+      Map<String, String> props = new HashMap<String, String>();
+      props.put("JBOSS_HOME", pkgManagerCtx.getJBossServerHome());
+      props.put("PM_HOME", pkgManagerCtx.getPackageManagerEnvironment().getPackageManagerHome().getAbsolutePath());
+      Project antProject = this.buildProject(script, pkgCtx.getPackageRoot(), props);
+      this.runTarget(antProject, "pre-install");
+
+   }
+
+   /**
+    * @see org.jboss.ejb3.packagemanager.script.ScriptProcessor#processPreUnInstallScript(PackageManagerContext, InstalledPackage, File)
+    */
+   @Override
+   public void processPreUnInstallScript(PackageManagerContext pkgManagerCtx, InstalledPackage installedPackage, File script)
+         throws ScriptProcessingException
+   {
+      // Set the properties JBOSS_HOME and PM_HOME for the 
+      // build scripts to use (if they find it necessary)
+      Map<String, String> props = new HashMap<String, String>();
+      props.put("JBOSS_HOME", pkgManagerCtx.getJBossServerHome());
+      props.put("PM_HOME", pkgManagerCtx.getPackageManagerEnvironment().getPackageManagerHome().getAbsolutePath());
+      
+      // TODO: What should basedir point to? Let's right now point it to the folder containing the
+      // script file
+      Project antProject = this.buildProject(script, script.getParentFile(), props);
+      this.runTarget(antProject, "pre-uninstall");
+
+
+   }
+
+   private Project buildProject(File scriptFile, File baseDir, Map<String, String> antProperties) throws ScriptProcessingException
+   {
+      if (!scriptFile.exists())
       {
-         throw new ScriptProcessingException("Ant script " + script.getFile() + " does not exist in " + pkgCtx);
+         throw new ScriptProcessingException("Ant script file " + scriptFile + " does not exist");
       }
       Project antProject = new Project();
       // add our build listener to capture ant logging and other stuff
       antProject.addBuildListener(new AntBuildListener());
-      // Set the basedir for the ant project to point to the 
-      // root of the package.xml file of the package being installed 
-      antProject.setBaseDir(pkgCtx.getPackageRoot());
-      // Also set the properties JBOSS_HOME and PM_HOME for the 
-      // build scripts to use (if they find it necessary)
-      antProject.setProperty("JBOSS_HOME", pkgManagerCtx.getJBossServerHome());
-      antProject.setProperty("PM_HOME", pkgManagerCtx.getPackageManagerEnvironment().getPackageManagerHome()
-            .getAbsolutePath());
+      // Set the basedir for the ant project  
+      antProject.setBaseDir(baseDir);
+      
+      if (antProperties != null)
+      {
+         Set<Entry<String, String>> entries = antProperties.entrySet();
+         for (Entry<String, String> entry : entries)
+         {
+            String propName = entry.getKey();
+            String propVal = entry.getValue();
+            antProject.setProperty(propName, propVal);
+         }
+
+      }
+      //      antProject.setProperty("JBOSS_HOME", pkgManagerCtx.getJBossServerHome());
+      //      antProject.setProperty("PM_HOME", pkgManagerCtx.getPackageManagerEnvironment().getPackageManagerHome()
+      //            .getAbsolutePath());
       // init the project
       antProject.init();
 
       ProjectHelper antProjHelper = ProjectHelper.getProjectHelper();
       // parse the project from the build file
-      antProjHelper.parse(antProject, antBuildFile);
+      antProjHelper.parse(antProject, scriptFile);
 
-      // now run the appropriate target
-      String targetName = null;
-      PackageInstallationPhase phase = script.getScriptExecutionPhase();
-      if (phase == PackageInstallationPhase.PRE_INSTALL)
-      {
-         targetName = "pre-install";
-      }
-      else if (phase == PackageInstallationPhase.POST_INSTALL)
-      {
-         targetName = "post-install";
-      }
-      else
-      {
-         throw new ScriptProcessingException(
-               "Ant script processor is only capable of running pre-install or post-install scripts. It cannot handle "
-                     + phase + " for script " + script);
-      }
+      return antProject;
+   }
+
+   private void runTarget(Project antProject, String targetName) throws ScriptProcessingException
+   {
       // check whether the target exists in the build file
       if (!antProject.getTargets().containsKey(targetName))
       {
-         throw new ScriptProcessingException("Target " + targetName + " not present in Ant script " + antBuildFile
-               + " for " + pkgCtx);
+         throw new ScriptProcessingException("Target " + targetName + " not present in Ant script file");
       }
-      logger.info("Running script " + antBuildFile + " ,target= " + targetName + " for " + pkgCtx);
       try
       {
          antProject.executeTarget(targetName);
       }
       catch (Exception e)
       {
-         throw new ScriptProcessingException("Exception while running target " + targetName + " in script "
-               + antBuildFile + " for " + pkgCtx);
+         throw new ScriptProcessingException("Exception while running target " + targetName + " in Ant script");
       }
 
    }

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/tx/JBossJTABasedTransactionManagerLookup.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/tx/JBossJTABasedTransactionManagerLookup.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/tx/JBossJTABasedTransactionManagerLookup.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,71 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.tx;
+
+import java.util.Properties;
+
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+import org.hibernate.HibernateException;
+import org.hibernate.transaction.TransactionManagerLookup;
+
+/**
+ * JBossJTABasedTransactionManagerLookup
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class JBossJTABasedTransactionManagerLookup implements TransactionManagerLookup
+{
+
+  /**
+   * @see org.hibernate.transaction.TransactionManagerLookup#getTransactionIdentifier(javax.transaction.Transaction)
+   */
+   @Override
+   public Object getTransactionIdentifier(Transaction transaction)
+   {
+      // we just return back the transaction (and that's allowed as per the javadocs of this method)
+      return transaction;
+   }
+
+   /**
+    * @see org.hibernate.transaction.TransactionManagerLookup#getTransactionManager(java.util.Properties)
+    */
+   @Override
+   public TransactionManager getTransactionManager(Properties props) throws HibernateException
+   {
+      // send back our transaction manager 
+      return TransactionManagerImpl.getInstance();
+   }
+
+   /**
+    * @see org.hibernate.transaction.TransactionManagerLookup#getUserTransactionName()
+    */
+   @Override
+   public String getUserTransactionName()
+   {
+      // we return null
+      return null;
+   }
+
+}

Added: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/tx/TransactionManagerImpl.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/tx/TransactionManagerImpl.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/tx/TransactionManagerImpl.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,148 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.tx;
+
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+/**
+ * TransactionManagerImpl
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class TransactionManagerImpl implements TransactionManager
+{
+
+   private TransactionManager delegate = com.arjuna.ats.jta.TransactionManager.transactionManager();
+   
+   private static TransactionManagerImpl singleInstance;
+   
+   private TransactionManagerImpl()
+   {
+      
+   }
+   
+   public synchronized static TransactionManager getInstance()
+   {
+      if (singleInstance == null)
+      {
+         singleInstance = new TransactionManagerImpl();
+      }
+      return singleInstance;
+   }
+
+   /* (non-Javadoc)
+    * @see javax.transaction.TransactionManager#begin()
+    */
+   @Override
+   public void begin() throws NotSupportedException, SystemException
+   {
+      delegate.begin();
+
+   }
+
+   /* (non-Javadoc)
+    * @see javax.transaction.TransactionManager#commit()
+    */
+   @Override
+   public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException,
+         SecurityException, IllegalStateException, SystemException
+   {
+      delegate.commit();
+
+   }
+
+   /* (non-Javadoc)
+    * @see javax.transaction.TransactionManager#getStatus()
+    */
+   @Override
+   public int getStatus() throws SystemException
+   {
+      return delegate.getStatus();
+   }
+
+   /* (non-Javadoc)
+    * @see javax.transaction.TransactionManager#getTransaction()
+    */
+   @Override
+   public Transaction getTransaction() throws SystemException
+   {
+      return delegate.getTransaction();
+   }
+
+   /* (non-Javadoc)
+    * @see javax.transaction.TransactionManager#resume(javax.transaction.Transaction)
+    */
+   @Override
+   public void resume(Transaction tobj) throws InvalidTransactionException, IllegalStateException, SystemException
+   {
+      delegate.resume(tobj);
+
+   }
+
+   /* (non-Javadoc)
+    * @see javax.transaction.TransactionManager#rollback()
+    */
+   @Override
+   public void rollback() throws IllegalStateException, SecurityException, SystemException
+   {
+      delegate.rollback();
+
+   }
+
+   /* (non-Javadoc)
+    * @see javax.transaction.TransactionManager#setRollbackOnly()
+    */
+   @Override
+   public void setRollbackOnly() throws IllegalStateException, SystemException
+   {
+      delegate.setRollbackOnly();
+
+   }
+
+   /* (non-Javadoc)
+    * @see javax.transaction.TransactionManager#setTransactionTimeout(int)
+    */
+   @Override
+   public void setTransactionTimeout(int seconds) throws SystemException
+   {
+      delegate.setTransactionTimeout(seconds);
+
+   }
+
+   /* (non-Javadoc)
+    * @see javax.transaction.TransactionManager#suspend()
+    */
+   @Override
+   public Transaction suspend() throws SystemException
+   {
+      return delegate.suspend();
+   }
+
+}

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/util/IOUtil.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/util/IOUtil.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/util/IOUtil.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -39,6 +39,13 @@
  */
 public class IOUtil
 {
+   /**
+    * Copies a file from one location to other
+    * 
+    * @param src The source file (should not be a directory)
+    * @param dest The destination file (should not be a directory)
+    * @throws IOException
+    */
    public static void copy(File src, File dest) throws IOException
    {
       FileInputStream fis = new FileInputStream(src);

Modified: projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/xml/PackageUnmarshaller.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/xml/PackageUnmarshaller.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/java/org/jboss/ejb3/packagemanager/xml/PackageUnmarshaller.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -23,7 +23,6 @@
 
 import java.net.URL;
 
-import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.events.XMLEvent;
 
 import org.codehaus.stax2.XMLInputFactory2;
@@ -35,7 +34,9 @@
 import org.jboss.ejb3.packagemanager.metadata.PackageType;
 import org.jboss.ejb3.packagemanager.metadata.PackagedDependency;
 import org.jboss.ejb3.packagemanager.metadata.PostInstallType;
+import org.jboss.ejb3.packagemanager.metadata.PostUnInstallType;
 import org.jboss.ejb3.packagemanager.metadata.PreInstallType;
+import org.jboss.ejb3.packagemanager.metadata.PreUnInstallType;
 import org.jboss.ejb3.packagemanager.metadata.ScriptType;
 import org.jboss.ejb3.packagemanager.metadata.SystemRequirementsType;
 import org.jboss.ejb3.packagemanager.metadata.UnProcessedDependenciesType;
@@ -45,8 +46,12 @@
 import org.jboss.ejb3.packagemanager.metadata.impl.PackagedDependencyImpl;
 import org.jboss.ejb3.packagemanager.metadata.impl.PostInstallImpl;
 import org.jboss.ejb3.packagemanager.metadata.impl.PostInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PostUnInstallImpl;
+import org.jboss.ejb3.packagemanager.metadata.impl.PostUnInstallScript;
 import org.jboss.ejb3.packagemanager.metadata.impl.PreInstallImpl;
 import org.jboss.ejb3.packagemanager.metadata.impl.PreInstallScript;
+import org.jboss.ejb3.packagemanager.metadata.impl.PreUnInstallImpl;
+import org.jboss.ejb3.packagemanager.metadata.impl.PreUninstallScript;
 import org.jboss.ejb3.packagemanager.metadata.impl.UnProcessedDependenciesImpl;
 
 /**
@@ -68,7 +73,6 @@
    public PackageType unmarshal(URL packageXml) throws Exception
    {
 
-
       XMLInputFactory2 xmlFactory = (XMLInputFactory2) XMLInputFactory2.newInstance();
       XMLStreamReader2 xmlStreamReader = (XMLStreamReader2) xmlFactory.createXMLStreamReader(packageXml.openStream());
 
@@ -80,7 +84,7 @@
       XMLValidationSchema schema = validationSchemaFactory.createSchema(packageXsd);;
       // enable validation (note: validation will happen during parse)
       xmlStreamReader.validateAgainst(schema);
-      
+
       // parse the xml
       PackageType pkgMetadata = null;
       while (xmlStreamReader.hasNext())
@@ -137,11 +141,21 @@
                   PostInstallType postInstall = processPostInstall(pkgMeta, xmlStreamReader);
                   pkgMeta.setPostInstall(postInstall);
                }
+               else if (childElement.equals("pre-uninstall"))
+               {
+                  PreUnInstallType preUnInstall = processPreUnInstall(pkgMeta, xmlStreamReader);
+                  pkgMeta.setPreUnInstall(preUnInstall);
+               }
+               else if (childElement.equals("post-uninstall"))
+               {
+                  PostUnInstallType postUnInstall = processPostUnInstall(pkgMeta, xmlStreamReader);
+                  pkgMeta.setPostUnInstall(postUnInstall);
+               }
                else if (childElement.equals("dependencies"))
                {
                   DependenciesType dependencies = this.processDependencies(pkgMeta, xmlStreamReader);
                   pkgMeta.setDependencies(dependencies);
-                  
+
                }
                break;
 
@@ -159,8 +173,8 @@
     * @return
     * @throws Exception
     */
-   private SystemRequirementsType processSystemRequirements(PackageType pkgMeta,
-         XMLStreamReader2 xmlStreamReader) throws Exception
+   private SystemRequirementsType processSystemRequirements(PackageType pkgMeta, XMLStreamReader2 xmlStreamReader)
+         throws Exception
    {
       // TODO Implement
       int event = xmlStreamReader.next();
@@ -210,7 +224,7 @@
          event = xmlStreamReader.next();
 
       }
-      
+
       return fileMeta;
    }
 
@@ -221,8 +235,7 @@
     * @return
     * @throws Exception
     */
-   private PreInstallType processPreInstall(PackageType pkgMeta, XMLStreamReader2 xmlStreamReader)
-         throws Exception
+   private PreInstallType processPreInstall(PackageType pkgMeta, XMLStreamReader2 xmlStreamReader) throws Exception
    {
       PreInstallType preInstall = new PreInstallImpl(pkgMeta);
       int event = xmlStreamReader.next();
@@ -234,7 +247,7 @@
                String childElement = xmlStreamReader.getLocalName();
                if (childElement.equals("script"))
                {
-                  ScriptType script = processPreInstallScript(preInstall, xmlStreamReader);
+                  PreInstallScript script = processPreInstallScript(preInstall, xmlStreamReader);
                   preInstall.addScript(script);
                }
                break;
@@ -251,9 +264,37 @@
     * @return
     * @throws Exception
     */
-   private PostInstallType processPostInstall(PackageType pkgMeta, XMLStreamReader2 xmlStreamReader)
-         throws Exception
+   private PreUnInstallType processPreUnInstall(PackageType pkgMeta, XMLStreamReader2 xmlStreamReader) throws Exception
    {
+      PreUnInstallType preInstall = new PreUnInstallImpl(pkgMeta);
+      int event = xmlStreamReader.next();
+      while (event != XMLEvent.END_ELEMENT)
+      {
+         switch (event)
+         {
+            case XMLEvent.START_ELEMENT :
+               String childElement = xmlStreamReader.getLocalName();
+               if (childElement.equals("script"))
+               {
+                  PreUninstallScript script = processPreUnInstallScript(preInstall, xmlStreamReader);
+                  preInstall.addScript(script);
+               }
+               break;
+         }
+         event = xmlStreamReader.next();
+      }
+      return preInstall;
+   }
+
+   /**
+    * 
+    * @param pkgMeta
+    * @param xmlStreamReader
+    * @return
+    * @throws Exception
+    */
+   private PostInstallType processPostInstall(PackageType pkgMeta, XMLStreamReader2 xmlStreamReader) throws Exception
+   {
       PostInstallType postInstall = new PostInstallImpl(pkgMeta);
       int event = xmlStreamReader.next();
       while (event != XMLEvent.END_ELEMENT)
@@ -264,7 +305,7 @@
                String childElement = xmlStreamReader.getLocalName();
                if (childElement.equals("script"))
                {
-                  ScriptType script = processPostInstallScript(postInstall, xmlStreamReader);
+                  PostInstallScript script = processPostInstallScript(postInstall, xmlStreamReader);
                   postInstall.addScript(script);
                }
                break;
@@ -276,6 +317,36 @@
 
    /**
     * 
+    * @param pkgMeta
+    * @param xmlStreamReader
+    * @return
+    * @throws Exception
+    */
+   private PostUnInstallType processPostUnInstall(PackageType pkgMeta, XMLStreamReader2 xmlStreamReader)
+         throws Exception
+   {
+      PostUnInstallType postUnInstall = new PostUnInstallImpl(pkgMeta);
+      int event = xmlStreamReader.next();
+      while (event != XMLEvent.END_ELEMENT)
+      {
+         switch (event)
+         {
+            case XMLEvent.START_ELEMENT :
+               String childElement = xmlStreamReader.getLocalName();
+               if (childElement.equals("script"))
+               {
+                  PostUnInstallScript script = processPostUnInstallScript(postUnInstall, xmlStreamReader);
+                  postUnInstall.addScript(script);
+               }
+               break;
+         }
+         event = xmlStreamReader.next();
+      }
+      return postUnInstall;
+   }
+
+   /**
+    * 
     * @param preInstallMeta
     * @param xmlStreamReader
     * @return
@@ -291,14 +362,29 @@
 
    /**
     * 
-    * @param preInstallMeta
+    * @param preUnInstallMeta
     * @param xmlStreamReader
     * @return
     * @throws Exception
     */
-   private PostInstallScript processPostInstallScript(PostInstallType postInstallMeta,
+   private PreUninstallScript processPreUnInstallScript(PreUnInstallType preUnInstallMeta,
          XMLStreamReader2 xmlStreamReader) throws Exception
    {
+      PreUninstallScript preInstallScript = new PreUninstallScript(preUnInstallMeta);
+      processScript(preInstallScript, xmlStreamReader);
+      return preInstallScript;
+   }
+
+   /**
+    * 
+    * @param preInstallMeta
+    * @param xmlStreamReader
+    * @return
+    * @throws Exception
+    */
+   private PostInstallScript processPostInstallScript(PostInstallType postInstallMeta, XMLStreamReader2 xmlStreamReader)
+         throws Exception
+   {
       PostInstallScript postInstallScript = new PostInstallScript(postInstallMeta);
       processScript(postInstallScript, xmlStreamReader);
       return postInstallScript;
@@ -306,19 +392,38 @@
 
    /**
     * 
+    * @param postUnInstall
     * @param xmlStreamReader
     * @return
+    * @throws Exception
     */
+   private PostUnInstallScript processPostUnInstallScript(PostUnInstallType postUnInstall,
+         XMLStreamReader2 xmlStreamReader) throws Exception
+   {
+      PostUnInstallScript postUnInstallScript = new PostUnInstallScript(postUnInstall);
+      processScript(postUnInstallScript, xmlStreamReader);
+      return postUnInstallScript;
+   }
+
+   /**
+    * 
+    * @param xmlStreamReader
+    * @return
+    */
    private ScriptType processScript(ScriptType script, XMLStreamReader2 xmlStreamReader) throws Exception
    {
 
       for (int i = 0; i < xmlStreamReader.getAttributeCount(); i++)
       {
-         String name = xmlStreamReader.getAttributeLocalName(i);
-         if ("file".equals(name))
+         String attrName = xmlStreamReader.getAttributeLocalName(i);
+         if ("name".equals(attrName))
          {
-            script.setFile(xmlStreamReader.getAttributeValue(i));
+            script.setName(xmlStreamReader.getAttributeValue(i));
          }
+         else if ("path".equals(attrName))
+         {
+            script.setPath(xmlStreamReader.getAttributeValue(i));
+         }
 
       }
       // consume the end event of file
@@ -328,11 +433,12 @@
          event = xmlStreamReader.next();
 
       }
-      
+
       return script;
    }
-   
-   private DependenciesType processDependencies(PackageType pkgMetadata, XMLStreamReader2 xmlStreamReader) throws Exception
+
+   private DependenciesType processDependencies(PackageType pkgMetadata, XMLStreamReader2 xmlStreamReader)
+         throws Exception
    {
       DependenciesType depMetadata = new DependenciesImpl(pkgMetadata);
       int event = xmlStreamReader.next();
@@ -344,7 +450,8 @@
                String childElement = xmlStreamReader.getLocalName();
                if (childElement.equals("unprocessed-dependencies"))
                {
-                  UnProcessedDependenciesType unProcessedDeps = processUnProcessedDependencies(pkgMetadata, xmlStreamReader);
+                  UnProcessedDependenciesType unProcessedDeps = processUnProcessedDependencies(pkgMetadata,
+                        xmlStreamReader);
                   depMetadata.setUnProcessedDependencies(unProcessedDeps);
                }
                else if (childElement.equals("packaged-dependency"))
@@ -353,14 +460,15 @@
                   depMetadata.addPackagedDependency(packagedDep);
                }
                break;
-               
+
          }
          event = xmlStreamReader.next();
       }
       return depMetadata;
    }
-   
-   private UnProcessedDependenciesType processUnProcessedDependencies(PackageType pkgMeta, XMLStreamReader2 xmlStreamReader) throws Exception
+
+   private UnProcessedDependenciesType processUnProcessedDependencies(PackageType pkgMeta,
+         XMLStreamReader2 xmlStreamReader) throws Exception
    {
       UnProcessedDependenciesType unProcessedDep = new UnProcessedDependenciesImpl(pkgMeta);
       for (int i = 0; i < xmlStreamReader.getAttributeCount(); i++)
@@ -385,8 +493,9 @@
       }
       return unProcessedDep;
    }
-   
-   private PackagedDependency processPackagedDependency(PackageType pkgMeta, XMLStreamReader2 xmlStreamReader) throws Exception
+
+   private PackagedDependency processPackagedDependency(PackageType pkgMeta, XMLStreamReader2 xmlStreamReader)
+         throws Exception
    {
       PackagedDependency packagedDep = new PackagedDependencyImpl(pkgMeta);
       for (int i = 0; i < xmlStreamReader.getAttributeCount(); i++)

Modified: projects/ejb3/trunk/package-manager/src/main/resources/META-INF/persistence.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/resources/META-INF/persistence.xml	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/resources/META-INF/persistence.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -1,19 +1,22 @@
 <persistence xmlns="http://java.sun.com/xml/ns/persistence" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd" version="1.0">
-  <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
+  <persistence-unit name="default" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
     <!-- <class>org.jboss.ejb3.packagemanager.metadata.impl.PackageImpl</class> -->
     <properties>
     
         <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
-         <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver"/>
+         <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedXADataSource"/>
+         <!-- <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/>-->
+         <property name="hibernate.transaction.manager_lookup_class" value="org.jboss.ejb3.packagemanager.tx.JBossJTABasedTransactionManagerLookup"/>
          <!-- <property name="hibernate.connection.username" value="sa"/>
          <property name="hibernate.connection.password" value=""/>  --> 
          <property name="hibernate.connection.url" value="jdbc:derby:pmdb"/>
          <property name="hibernate.max_fetch_depth" value="3"/>
          <!--  <property name="hibernate.hbm2ddl.auto" value="create-drop"/> -->
-         <property name="hibernate.connection.autocommit" value="false"/> 
+         <!-- <property name="hibernate.connection.autocommit" value="false"/> --> 
+         <!-- <property name="hibernate.connection.release_mode" value="on_close"/> -->
          <!--   
          <property name="hibernate.connection.isolation" value="2"/> -->
          

Modified: projects/ejb3/trunk/package-manager/src/main/resources/log4j.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/resources/log4j.xml	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/resources/log4j.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -23,7 +23,7 @@
   <!-- A time/date based rolling appender -->
   <appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">
     <param name="File" value="log/test.log"/>
-    <param name="Threshold" value="DEBUG"/>
+    
     <param name="Append" value="false"/>
 
     <!-- Rollover at midnight each day -->
@@ -35,7 +35,7 @@
 
     <layout class="org.apache.log4j.PatternLayout">
       <!-- The default pattern: Date Priority [Category] Message\n -->
-      <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
+      <param name="ConversionPattern" value="%d %-5p [%t] [%c] %m%n"/>
 
       <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n
       <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
@@ -52,7 +52,7 @@
     <param name="Threshold" value="INFO"/>
     <layout class="org.apache.log4j.PatternLayout">
       <!-- The default pattern: Date Priority [Category] Message\n -->
-      <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
+      <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t] [%c{1}] %m%n"/>
     </layout>
   </appender>
 
@@ -64,7 +64,9 @@
   <!-- ======================= -->
   <!-- Setup the Root category -->
   <!-- ======================= -->
-
+ <category name="org.hibernate">
+    <priority value="ALL"/>
+  </category>
   <root>
     <appender-ref ref="CONSOLE"/>
     <appender-ref ref="FILE"/>

Modified: projects/ejb3/trunk/package-manager/src/main/resources/package.xsd
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/resources/package.xsd	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/resources/package.xsd	2009-11-10 20:54:11 UTC (rev 96233)
@@ -170,14 +170,15 @@
         <xs:annotation>
             <xs:documentation>
                 A script element points to a Ant build script file.
-                The file attribute of this element contains the path of the script, relative to the location of
+                The name attribute of the this elements contains the name of the script file. By default 
+                this is "package-script.xml"
+                The path attribute of this element contains the path of the script, relative to the location of
                 package.xml in the package.
-                By default the file attribute value is "package-script.xml"
-
             </xs:documentation>
 
         </xs:annotation>
-        <xs:attribute name="file" type="xs:string" use="optional" default="package-script.xml"/>
+        <xs:attribute name="name" type="xs:string" use="optional" default="package-script.xml"/>
+        <xs:attribute name="path" type="xs:string" use="optional"/>
         <!--<xs:attribute name="processor" type="xs:string" use="optional"
                       default="org.jboss.ejb3.packagemanager.script.impl.AntScriptProcessor"/> -->
     </xs:complexType>

Modified: projects/ejb3/trunk/package-manager/src/main/resources/schema.sql
===================================================================
--- projects/ejb3/trunk/package-manager/src/main/resources/schema.sql	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/main/resources/schema.sql	2009-11-10 20:54:11 UTC (rev 96233)
@@ -30,6 +30,18 @@
 
 );
 
+-- Script file
+-- DROP TABLE installation_file;
+CREATE TABLE script (
+	id bigint not null GENERATED ALWAYS AS IDENTITY	CONSTRAINT SCRIPT_PK PRIMARY KEY,
+	package_name varchar(255) not null,
+	name varchar(255) not null,
+	path varchar(255) not null,
+	scriptType varchar(255) not null,
+	foreign key (package_name) references package (name) 
+
+);
+
 -- Package dependencies
 -- DROP TABLE package_dependency;
 CREATE TABLE package_dependency (

Modified: projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/commandline/unit/CommandLineTestCase.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/commandline/unit/CommandLineTestCase.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/commandline/unit/CommandLineTestCase.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -25,8 +25,8 @@
 
 import org.jboss.ejb3.packagemanager.PackageManager;
 import org.jboss.ejb3.packagemanager.PackageManagerEnvironment;
+import org.jboss.ejb3.packagemanager.PackageManagerFactory;
 import org.jboss.ejb3.packagemanager.exception.PackageNotInstalledException;
-import org.jboss.ejb3.packagemanager.impl.DefaultPackageManagerImpl;
 import org.jboss.ejb3.packagemanager.main.Main;
 import org.jboss.ejb3.packagemanager.test.common.PackageManagerTestCase;
 import org.jboss.logging.Logger;
@@ -45,12 +45,8 @@
 
    private static Logger logger = Logger.getLogger(CommandLineTestCase.class);
 
+  
    /**
-    * Package manager
-    */
-   private static PackageManager pkgMgr;
-
-   /**
     * The JBoss Home used in each test
     */
    private static File jbossHome;
@@ -69,8 +65,8 @@
    {
       pkgMgrHome = setupPackageManagerHome(CommandLineTestCase.class);
       jbossHome = setupDummyJBoss(CommandLineTestCase.class);
-      PackageManagerEnvironment env = new PackageManagerEnvironment(pkgMgrHome.getAbsolutePath());
-      pkgMgr = new DefaultPackageManagerImpl(env, jbossHome.getAbsolutePath());
+     
+     
    }
 
    /**

Modified: projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/common/PackageManagerTestCase.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/common/PackageManagerTestCase.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/common/PackageManagerTestCase.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -97,6 +97,12 @@
    private static void setupDatabase(File dbHome) throws IOException, SQLException
    {
       System.setProperty("derby.system.home", dbHome.getAbsolutePath());
+//      System.setProperty("derby.stream.error.logSeverityLevel", "20000");
+//      System.setProperty("derby.language.logStatementText", "true");
+//      //System.setProperty("derby.locks.escalationThreshold", "50000");
+//      
+//      System.setProperty("derby.locks.monitor", "true");
+//      System.setProperty("derby.locks.deadlockTrace", "true");
       InputStream sql = Thread.currentThread().getContextClassLoader().getResourceAsStream(PACKAGE_MANAGER_DB_SCHEMA_FILE_NAME);
 
       if (sql == null)
@@ -105,7 +111,17 @@
                "Could not find package-manager-sql-scripts.sql in classpath - Cannot setup database");
       }
       Connection conn = DriverManager.getConnection("jdbc:derby:pmdb;create=true");
-      DBUtil.runSql(conn, sql);
+      try
+      {
+         DBUtil.runSql(conn, sql);
+      }
+      finally
+      {
+         if (conn != null)
+         {
+            conn.close();
+         }
+      }
       logger.info("Successfully setup package manager database at " + dbHome);
 
    }
@@ -336,25 +352,149 @@
     */
    protected File createPackageWithPreInstallScript(String packageFileName) throws IOException
    {
-      File dummyJar = this.createDummyJar();
-
-      // Now let's package the dummy.jar, package.xml and build.xml into a package
-      File packageWithPreInstallScript = new File(getPerTestTargetDir(this.getClass()), packageFileName);
-      JavaArchive pkg = JavaArchiveFactory.create(packageWithPreInstallScript.getName());
-      pkg.addResource("dummy.jar", dummyJar);
+      
       URL packageXmlURL = this.getResource(PackageManagerTestCase.class, "package-with-pre-install-script.xml");
       File packageXmlFile = new File(packageXmlURL.getFile());
-      pkg.addResource("package.xml", packageXmlFile);
       URL buildXmlURL = this.getResource(PackageManagerTestCase.class, "build.xml");
       File buildFile = new File(buildXmlURL.getFile());
-      pkg.addResource("build.xml", buildFile);
+      return this.createPackageWithScript(packageFileName, buildFile, packageXmlFile);
+   }
+   
+   
+   
+   /**
+    * Creates a package containing a file to install and a pre-install script. The package
+    * will look as follows:
+    * 
+    *  <package-name>
+    *   |
+    *   |--- dummy.jar
+    *   |
+    *   |--- package.xml
+    *   |
+    *   |--- build.xml
+    *   
+    * The package.xml is configured to install the dummy.jar to JBOSS_HOME/server/default/deploy. 
+    * Additionally, the package.xml is also configured for the pre-install script named build.xml,
+    * which is available at the root of the package. The build.xml script is implemented
+    * to place a file named "pre-uninstall.txt" under JBOSS_HOME/bin folder, when the script is run.
+    *   
+    * @param packageFileName The name of the package to be created. Ex: simple-package.jar
+    *   Note: It is mandatory to specify the extension (.jar) which passing the packageFileName
+    * @return Returns the {@link File} corresponding the to the created package
+    * @throws IOException If any IO exceptions occur during the package creation
+    */
+   protected File createPackageWithPreUnInstallScript(String packageFileName) throws IOException
+   {
+      
+      URL packageXmlURL = this.getResource(PackageManagerTestCase.class, "package-with-pre-uninstall-script.xml");
+      File packageXmlFile = new File(packageXmlURL.getFile());
+      URL buildXmlURL = this.getResource(PackageManagerTestCase.class, "build.xml");
+      File buildFile = new File(buildXmlURL.getFile());
+      return this.createPackageWithScript(packageFileName, buildFile, packageXmlFile);
+   }
+   
+   /**
+    * Creates a package containing a file to install and a pre-install script. The package
+    * will look as follows:
+    * 
+    *  <package-name>
+    *   |
+    *   |--- dummy.jar
+    *   |
+    *   |--- package.xml
+    *   |
+    *   |--- build.xml
+    *   
+    * The package.xml is configured to install the dummy.jar to JBOSS_HOME/server/default/deploy. 
+    * Additionally, the package.xml is also configured for the pre-install script named build.xml,
+    * which is available at the root of the package. The build.xml script is implemented
+    * to place a file named "post-install.txt" under JBOSS_HOME/bin folder, when the script is run.
+    *   
+    * @param packageFileName The name of the package to be created. Ex: simple-package.jar
+    *   Note: It is mandatory to specify the extension (.jar) which passing the packageFileName
+    * @return Returns the {@link File} corresponding the to the created package
+    * @throws IOException If any IO exceptions occur during the package creation
+    */
+   protected File createPackageWithPostInstallScript(String packageFileName) throws IOException
+   {
+      
+      URL packageXmlURL = this.getResource(PackageManagerTestCase.class, "package-with-post-install-script.xml");
+      File packageXmlFile = new File(packageXmlURL.getFile());
+      URL buildXmlURL = this.getResource(PackageManagerTestCase.class, "build.xml");
+      File buildFile = new File(buildXmlURL.getFile());
+      return this.createPackageWithScript(packageFileName, buildFile, packageXmlFile);
+   }
+   
+   /**
+    * Creates a package containing a file to install and a pre-install script. The package
+    * will look as follows:
+    * 
+    *  <package-name>
+    *   |
+    *   |--- dummy.jar
+    *   |
+    *   |--- package.xml
+    *   |
+    *   |--- build.xml
+    *   
+    * The package.xml is configured to install the dummy.jar to JBOSS_HOME/server/default/deploy. 
+    * Additionally, the package.xml is also configured for the post-uninstall script named build.xml,
+    * which is available at the root of the package. The build.xml script is implemented
+    * to place a file named "post-uninstall.txt" from JBOSS_HOME/bin folder
+    *   
+    * @param packageFileName The name of the package to be created. Ex: simple-package.jar
+    *   Note: It is mandatory to specify the extension (.jar) which passing the packageFileName
+    * @return Returns the {@link File} corresponding the to the created package
+    * @throws IOException If any IO exceptions occur during the package creation
+    */
+   protected File createPackageWithPostUnInstallScript(String packageFileName) throws IOException
+   {
+      
+      URL packageXmlURL = this.getResource(PackageManagerTestCase.class, "package-with-post-uninstall-script.xml");
+      File packageXmlFile = new File(packageXmlURL.getFile());
+      URL buildXmlURL = this.getResource(PackageManagerTestCase.class, "build.xml");
+      File buildFile = new File(buildXmlURL.getFile());
+      return this.createPackageWithScript(packageFileName, buildFile, packageXmlFile);
+   }
+   
+   
 
+   /**
+    * Utility method to create a package with a script file.
+    * 
+    * The package
+    * will look as follows:
+    * 
+    *  <package-name>
+    *   |
+    *   |--- dummy.jar
+    *   |
+    *   |--- package.xml
+    *   |
+    *   |--- [script-file]
+    *   
+    * @param packageFileName Package file name
+    * @param scriptFile Script file
+    * @param packageXmlFile package.xml
+    * @return Returns the created package
+    * @throws IOException
+    */
+   private File createPackageWithScript(String packageFileName, File scriptFile, File packageXmlFile) throws IOException
+   {
+      File dummyJar = this.createDummyJar();
+      File packageWithScript = new File(getPerTestTargetDir(this.getClass()), packageFileName);
+      JavaArchive pkg = JavaArchiveFactory.create(packageWithScript.getName());
+      pkg.addResource("dummy.jar", dummyJar);
+      pkg.addResource("package.xml", packageXmlFile);
+      pkg.addResource(scriptFile.getName(), scriptFile);
+      
       // now write out the package to disk
       logger.debug("Writing out the created package " + pkg.toString(true));
-      this.exportZip(pkg, packageWithPreInstallScript);
-      return packageWithPreInstallScript;
+      this.exportZip(pkg, packageWithScript);
+      return packageWithScript;
    }
-
+   
    /**
     * Creates a package  containing a file to install and a packaged-dependency. The package
     * will look as follows:

Modified: projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/dependency/unit/DependencyInstallTestCase.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/dependency/unit/DependencyInstallTestCase.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/dependency/unit/DependencyInstallTestCase.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -28,9 +28,8 @@
 
 import org.jboss.ejb3.packagemanager.PackageManager;
 import org.jboss.ejb3.packagemanager.PackageManagerEnvironment;
-import org.jboss.ejb3.packagemanager.impl.DefaultPackageManagerImpl;
+import org.jboss.ejb3.packagemanager.PackageManagerFactory;
 import org.jboss.ejb3.packagemanager.test.common.PackageManagerTestCase;
-import org.jboss.ejb3.packagemanager.test.uninstall.unit.UnInstallTestCase;
 import org.jboss.logging.Logger;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.jboss.shrinkwrap.api.spec.JavaArchiveFactory;
@@ -78,7 +77,7 @@
       pkgMgrHome = setupPackageManagerHome(DependencyInstallTestCase.class);
       jbossHome = setupDummyJBoss(DependencyInstallTestCase.class);
       PackageManagerEnvironment env = new PackageManagerEnvironment(pkgMgrHome.getAbsolutePath());
-      pkgMgr = new DefaultPackageManagerImpl(env, jbossHome.getAbsolutePath());
+      pkgMgr = PackageManagerFactory.getDefaultPackageManager(env, jbossHome.getAbsolutePath());
    }
 
    /**

Modified: projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/install/unit/BasicInstallTestCase.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/install/unit/BasicInstallTestCase.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/install/unit/BasicInstallTestCase.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -26,6 +26,7 @@
 
 import org.jboss.ejb3.packagemanager.PackageManager;
 import org.jboss.ejb3.packagemanager.PackageManagerEnvironment;
+import org.jboss.ejb3.packagemanager.PackageManagerFactory;
 import org.jboss.ejb3.packagemanager.impl.DefaultPackageManagerImpl;
 import org.jboss.ejb3.packagemanager.main.Main;
 import org.jboss.ejb3.packagemanager.test.common.PackageManagerTestCase;
@@ -73,7 +74,7 @@
       pkgMgrHome = setupPackageManagerHome(BasicInstallTestCase.class);
       jbossHome = setupDummyJBoss(BasicInstallTestCase.class);
       PackageManagerEnvironment env = new PackageManagerEnvironment(pkgMgrHome.getAbsolutePath());
-      pkgMgr = new DefaultPackageManagerImpl(env, jbossHome.getAbsolutePath());
+      pkgMgr = PackageManagerFactory.getDefaultPackageManager(env, jbossHome.getAbsolutePath());
    }
 
    /**

Modified: projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/uninstall/unit/UnInstallTestCase.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/uninstall/unit/UnInstallTestCase.java	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/uninstall/unit/UnInstallTestCase.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -25,6 +25,7 @@
 
 import org.jboss.ejb3.packagemanager.PackageManager;
 import org.jboss.ejb3.packagemanager.PackageManagerEnvironment;
+import org.jboss.ejb3.packagemanager.PackageManagerFactory;
 import org.jboss.ejb3.packagemanager.exception.PackageNotInstalledException;
 import org.jboss.ejb3.packagemanager.impl.DefaultPackageManagerImpl;
 import org.jboss.ejb3.packagemanager.test.common.PackageManagerTestCase;
@@ -72,7 +73,7 @@
       pkgMgrHome = setupPackageManagerHome(UnInstallTestCase.class);
       jbossHome = setupDummyJBoss(UnInstallTestCase.class);
       PackageManagerEnvironment env = new PackageManagerEnvironment(pkgMgrHome.getAbsolutePath());
-      pkgMgr = new DefaultPackageManagerImpl(env, jbossHome.getAbsolutePath());
+      pkgMgr = PackageManagerFactory.getDefaultPackageManager(env, jbossHome.getAbsolutePath());
    }
 
    
@@ -160,5 +161,34 @@
       this.assertFileExistenceUnderJBossHome(jbossHome, "common/lib/dummy.jar");
 
    }
+   
+   /**
+    * Tests that the post-uninstall script runs during the uninstall process  
+    * 
+    * @throws Exception
+    */
+   @Test
+   public void testPostUnInstallScriptExecution() throws Exception
+   {
+      File postUnInstallScriptPackage = this.createPackageWithPostUnInstallScript("post-uninstall-test-package.jar");
+      
+      // As a sanity check, ensure that the file supposed to be created by our post-uninstall 
+      // step is not already present
+      this.assertFileAbsenceUnderJBossHome(jbossHome, "bin/post-uninstall.txt");
+      
+      // first install
+      pkgMgr.installPackage(postUnInstallScriptPackage.getAbsolutePath());
+      
+      // simple check to ensure installation was successful
+      this.assertFileExistenceUnderJBossHome(jbossHome, "server/default/deploy/dummy.jar");
+      
+      // now uninstall
+      pkgMgr.removePackage("common-package-with-post-uninstall");
+      // make sure uninstall was successful
+      this.assertFileAbsenceUnderJBossHome(jbossHome, "server/default/deploy/dummy.jar");
+      // check that post-uninstall script was run
+      this.assertFileExistenceUnderJBossHome(jbossHome, "bin/post-uninstall.txt");
+      
+   }
 
 }

Added: projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/upgrade/unit/UpgradeUnitTestCase.java
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/upgrade/unit/UpgradeUnitTestCase.java	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/test/java/org/jboss/ejb3/packagemanager/test/upgrade/unit/UpgradeUnitTestCase.java	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,92 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ejb3.packagemanager.test.upgrade.unit;
+
+import java.io.File;
+
+import org.jboss.ejb3.packagemanager.PackageManager;
+import org.jboss.ejb3.packagemanager.PackageManagerEnvironment;
+import org.jboss.ejb3.packagemanager.PackageManagerFactory;
+import org.jboss.ejb3.packagemanager.test.common.PackageManagerTestCase;
+import org.jboss.logging.Logger;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * UpgradeUnitTestCase
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class UpgradeUnitTestCase extends PackageManagerTestCase
+{
+
+   /**
+    * Logger
+    */
+   private static Logger logger = Logger.getLogger(UpgradeUnitTestCase.class);
+
+   /**
+    * Package manager
+    */
+   private static PackageManager pkgMgr;
+
+   /**
+    * The JBoss Home used in each test
+    */
+   private static File jbossHome;
+
+   /**
+    * Package manager home used in each test
+    */
+   private static File pkgMgrHome;
+
+   private static File perTestTargetDir = getPerTestTargetDir(UpgradeUnitTestCase.class);
+
+   /**
+    * Do the necessary setup
+    * @throws Exception
+    */
+   @BeforeClass
+   public static void beforeClass() throws Exception
+   {
+      pkgMgrHome = setupPackageManagerHome(UpgradeUnitTestCase.class);
+      jbossHome = setupDummyJBoss(UpgradeUnitTestCase.class);
+      PackageManagerEnvironment env = new PackageManagerEnvironment(pkgMgrHome.getAbsolutePath());
+      pkgMgr = PackageManagerFactory.getDefaultPackageManager(env, jbossHome.getAbsolutePath());
+   }
+   
+   @Test
+   public void testSimpleUpgrade() throws Exception
+   {
+      // first install a simple package, then call upgrade on the same package
+      File simplePackage = this.createSimplePackage("simple-package.jar");
+      
+      this.pkgMgr.installPackage(simplePackage.getAbsolutePath());
+      
+      this.assertFileExistenceUnderJBossHome(jbossHome, "common/lib/dummy.jar");
+      
+      // now upgrade
+      this.pkgMgr.updatePackage(simplePackage.getAbsolutePath());
+      this.assertFileExistenceUnderJBossHome(jbossHome, "common/lib/dummy.jar");
+   }
+}

Modified: projects/ejb3/trunk/package-manager/src/test/resources/log4j.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/resources/log4j.xml	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/resources/log4j.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -23,7 +23,7 @@
   <!-- A time/date based rolling appender -->
   <appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">
     <param name="File" value="target/test.log"/>
-    <param name="Threshold" value="DEBUG"/>
+    
     <param name="Append" value="false"/>
 
     <!-- Rollover at midnight each day -->
@@ -35,7 +35,7 @@
 
     <layout class="org.apache.log4j.PatternLayout">
       <!-- The default pattern: Date Priority [Category] Message\n -->
-      <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
+      <param name="ConversionPattern" value="%d %-5p [%t] [%c] %m%n"/>
 
       <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n
       <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
@@ -52,7 +52,7 @@
        <!--  <param name="Threshold" value="INFO"/> -->
     <layout class="org.apache.log4j.PatternLayout">
       <!-- The default pattern: Date Priority [Category] Message\n -->
-      <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
+      <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t] [%c{1}] %m%n"/>
     </layout>
   </appender>
 
@@ -69,7 +69,9 @@
     <priority value="ALL"/>
   </category>
 
-
+    <category name="org.hibernate">
+    <priority value="ALL"/>
+  </category>
   <!-- ======================= -->
   <!-- Setup the Root category -->
   <!-- ======================= -->

Modified: projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/build.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/build.xml	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/build.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -34,4 +34,32 @@
 		<echo file="${JBOSS_HOME}/bin/test.txt" message="This proves that the pre-install script was run"/>
 		<echo level="debug" message="Test property value is = ${test}"/>
 	</target>
+	
+	<target name="post-install">
+			<echo level="info">***************************************************************</echo>
+			<echo level="info">This is the post-install target in the dummy package!</echo>
+			<echo level="info">Package manager home is = ${PM_HOME}</echo>
+			<echo level="info">JBoss AS home is = ${JBOSS_HOME}</echo>
+			<echo level="info">***************************************************************</echo>
+			<echo file="${JBOSS_HOME}/bin/post-install.txt" message="This proves that the post-install script was run"/>
+	</target>
+	
+	<target name="pre-uninstall">
+			<echo level="info">***************************************************************</echo>
+			<echo level="info">This is the pre-uninstall target in the dummy package!</echo>
+			<echo level="info">Package manager home is = ${PM_HOME}</echo>
+			<echo level="info">JBoss AS home is = ${JBOSS_HOME}</echo>
+			<echo level="info">***************************************************************</echo>
+			<echo file="${JBOSS_HOME}/bin/pre-uninstall.txt" message="This proves that the pre-uninstall script was run"/>
+	</target>
+
+	<target name="post-uninstall">
+			<echo level="info">***************************************************************</echo>
+			<echo level="info">This is the post-uninstall target in the dummy package!</echo>
+			<echo level="info">Package manager home is = ${PM_HOME}</echo>
+			<echo level="info">JBoss AS home is = ${JBOSS_HOME}</echo>
+			<echo level="info">***************************************************************</echo>
+			<echo file="${JBOSS_HOME}/bin/post-uninstall.txt" message="This proves that the post-uninstall script was run"/>
+	</target>
+
 </project>
\ No newline at end of file

Added: projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-post-install-script.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-post-install-script.xml	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-post-install-script.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,11 @@
+<sh:package name="common-package-with-post-install" version="1.0.0-Alpha1"
+xmlns:sh="http://www.jboss.org/schema">
+
+    <!--  Package to install a dummy jar into JBOSS_AS/server/default/deploy -->  
+  <file name="dummy.jar" dest-path="server/default/deploy" type="library"/>
+  
+  <post-install>
+    <script name="build.xml"/>
+  </post-install>
+  
+</sh:package>
\ No newline at end of file

Added: projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-post-uninstall-script.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-post-uninstall-script.xml	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-post-uninstall-script.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,11 @@
+<sh:package name="common-package-with-post-uninstall" version="1.0.0-Alpha1"
+xmlns:sh="http://www.jboss.org/schema">
+
+    <!--  Package to install a dummy jar into JBOSS_AS/server/default/deploy -->  
+  <file name="dummy.jar" dest-path="server/default/deploy" type="library"/>
+  
+  <post-uninstall>
+    <script name="build.xml"/>
+  </post-uninstall>
+  
+</sh:package>
\ No newline at end of file

Modified: projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-pre-install-script.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-pre-install-script.xml	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-pre-install-script.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -5,7 +5,7 @@
   <file name="dummy.jar" dest-path="server/default/deploy" type="library"/>
   
   <pre-install>
-    <script file="build.xml"/>
+    <script name="build.xml"/>
   </pre-install>
   
 </sh:package>
\ No newline at end of file

Added: projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-pre-uninstall-script.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-pre-uninstall-script.xml	                        (rev 0)
+++ projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/common/package-with-pre-uninstall-script.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -0,0 +1,11 @@
+<sh:package name="common-package-with-pre-uninstall" version="1.0.0-Alpha1"
+xmlns:sh="http://www.jboss.org/schema">
+
+    <!--  Package to install a dummy jar into JBOSS_AS/server/default/deploy -->  
+  <file name="dummy.jar" dest-path="server/default/deploy" type="library"/>
+  
+  <pre-uninstall>
+    <script name="build.xml"/>
+  </pre-uninstall>
+  
+</sh:package>
\ No newline at end of file

Modified: projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package1.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package1.xml	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package1.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -5,7 +5,7 @@
   <file name="dummy1.jar" dest-path="server/default/deployers" type="library"/>
   
   <pre-install>
-    <script file="scripts/pre-install-build.xml"/>
+    <script path="scripts" name="pre-install-build.xml"/>
   </pre-install>
   
 </sh:package>
\ No newline at end of file

Modified: projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package2.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package2.xml	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package2.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -5,7 +5,7 @@
   <file name="dummy2.jar" dest-path="server/default/deployers" type="library"/>
   
   <post-install>
-    <script file="scripts/post-install-build.xml"/>
+    <script path="scripts" name="post-install-build.xml"/>
   </post-install>
   
 </sh:package>
\ No newline at end of file

Modified: projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package3.xml
===================================================================
--- projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package3.xml	2009-11-10 20:52:56 UTC (rev 96232)
+++ projects/ejb3/trunk/package-manager/src/test/resources/org/jboss/ejb3/packagemanager/test/dependency/unit/dependee-package3.xml	2009-11-10 20:54:11 UTC (rev 96233)
@@ -5,11 +5,11 @@
   <file name="dummy3.jar" dest-path="server/default/deployers" type="library"/>
   
   <pre-install>
-    <script file="build.xml"/>
+    <script name="build.xml"/>
   </pre-install>
 
   <post-install>
-    <script file="build.xml"/>
+    <script name="build.xml"/>
   </post-install>
   
 </sh:package>
\ No newline at end of file




More information about the jboss-cvs-commits mailing list