[jbosstools-commits] JBoss Tools SVN: r6878 - in trunk: as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/modules and 18 other directories.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Tue Mar 11 15:41:22 EDT 2008


Author: rob.stryker at jboss.com
Date: 2008-03-11 15:41:22 -0400 (Tue, 11 Mar 2008)
New Revision: 6878

Added:
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModelException.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModel.java
Removed:
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModelListenerManager.java
Modified:
   trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/EarArchiveType.java
   trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/EjbArchiveType.java
   trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/J2EEArchiveType.java
   trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/WarArchiveType.java
   trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/modules/ArchivesBuildListener.java
   trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/modules/ArchivesModelModuleContributor.java
   trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/packages/ArchivePublishWizard.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/WorkspaceChangeListener.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/build/ModelChangeListenerWithRefresh.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/model/types/WorkspaceJARArchiveType.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/project/ArchivesBuilder.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ant/IsolatedAntExecution.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ant/IsolatedTruezipExecution.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/build/ModelChangeListener.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModel.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModelCore.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/EventManager.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModelNode.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveNode.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveNodeDelta.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveDeltaPreNodeFactory.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveModelNode.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveNodeDeltaImpl.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveNodeImpl.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/xb/XMLBinding.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/util/ModelUtil.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/dialogs/ArchiveNodeDestinationDialog.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/providers/ArchivesContentProvider.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/views/ArchivesMenuHandler.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/views/ProjectArchivesView.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/AbstractArchiveWizard.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/FilesetWizard.java
   trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/pages/ArchiveInfoWizardPage.java
   trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/ModelUtilTest.java
   trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/ModelCreationTest.java
   trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/XBMarshallTest.java
   trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/XBUnmarshallTest.java
Log:
Archives API Refactor.

Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/EarArchiveType.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/EarArchiveType.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/EarArchiveType.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -29,6 +29,7 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jst.server.core.IEnterpriseApplication;
 import org.eclipse.wst.server.core.IModule;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFolder;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveType;
@@ -84,6 +85,7 @@
 	}
 
 	public IArchive fillDefaultConfiguration(String projectName, IArchive topLevel, IProgressMonitor monitor) {
+		try {
 		IModule mod = getModule(projectName);
 		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
 
@@ -110,7 +112,7 @@
 			}
 		}
 
+		} catch( ArchivesModelException ame) {}
 		return topLevel;
 	}
-
 }

Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/EjbArchiveType.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/EjbArchiveType.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/EjbArchiveType.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -28,6 +28,7 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.wst.server.core.IModule;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 
 /**
@@ -71,8 +72,7 @@
 					IPath outputLoc = proj.getOutputLocation();
 					addFileset(project, topLevel, outputLoc.toOSString(), null);
 				} catch( JavaModelException jmde) {
-					// ignore. No reporting necessary here
-				}
+				} catch( ArchivesModelException ame ) {}
 			}
 		}
 		return topLevel;

Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/J2EEArchiveType.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/J2EEArchiveType.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/J2EEArchiveType.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -37,6 +37,7 @@
 import org.eclipse.wst.server.core.IModuleArtifact;
 import org.eclipse.wst.server.core.internal.ServerPlugin;
 import org.jboss.ide.eclipse.archives.core.model.ArchiveNodeFactory;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFileSet;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFolder;
@@ -118,13 +119,15 @@
 	}
 
 	
-	public static IArchiveFolder addFolder(IProject project, IArchiveNode parent, String name) {
+	public static IArchiveFolder addFolder(IProject project, 
+			IArchiveNode parent, String name) throws ArchivesModelException {
 		IArchiveFolder folder = ArchiveNodeFactory.createFolder();
 		folder.setName(name);
 		parent.addChild(folder);
 		return folder;
 	}
-	public static IArchiveFileSet addFileset(IProject project, IArchiveNode parent, String sourcePath, String includePattern) {
+	public static IArchiveFileSet addFileset(IProject project, IArchiveNode parent, 
+			String sourcePath, String includePattern) throws ArchivesModelException {
 		IArchiveFileSet fs = ArchiveNodeFactory.createFileset();
 		Assert.isNotNull(project);
 		IJavaProject javaProject = JavaCore.create(project);

Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/WarArchiveType.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/WarArchiveType.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/extensions/archives/WarArchiveType.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -41,6 +41,7 @@
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.server.core.IModule;
 import org.jboss.ide.eclipse.archives.core.ArchivesCorePlugin;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.DirectoryScannerFactory;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFileSet;
@@ -77,24 +78,26 @@
 		return fillDefaultConfiguration(getProject(projectName), topLevel, monitor);
 	}
 	public IArchive fillDefaultConfiguration(IProject project, IArchive topLevel, IProgressMonitor monitor) {	
-		IModule mod = getModule(project.getName());
-		IArchiveFolder webinf = addFolder(project, topLevel, WEBINF);
-		IArchiveFolder lib = addFolder(project, webinf, LIB);
-		IArchiveFolder classes = addFolder(project, webinf, CLASSES);
-		addReferencedProjectsAsLibs(project, lib);
-		addLibFileset(project, lib, true);
-		addClassesFileset(project, classes);
-
-		if( mod == null ) {
-			addWebinfFileset(project, webinf);
-		} else {
-			addWebContentFileset(project, topLevel);
-		}
+		try {
+			IModule mod = getModule(project.getName());
+			IArchiveFolder webinf = addFolder(project, topLevel, WEBINF);
+			IArchiveFolder lib = addFolder(project, webinf, LIB);
+			IArchiveFolder classes = addFolder(project, webinf, CLASSES);
+			addReferencedProjectsAsLibs(project, lib);
+			addLibFileset(project, lib, true);
+			addClassesFileset(project, classes);
+	
+			if( mod == null ) {
+				addWebinfFileset(project, webinf);
+			} else {
+				addWebContentFileset(project, topLevel);
+			}
+		} catch( ArchivesModelException ame) {}
 		return topLevel;
 	}
 	
 	// For modules only
-	protected void addWebContentFileset(IProject project, IArchiveNode packageRoot) {
+	protected void addWebContentFileset(IProject project, IArchiveNode packageRoot) throws ArchivesModelException {
 		try {
 			IPath projectPath = project.getLocation();
 			DirectoryScanner scanner = 
@@ -115,7 +118,7 @@
 		}
 	}
 
-	protected void addClassesFileset(IProject project, IArchiveFolder folder) {
+	protected void addClassesFileset(IProject project, IArchiveFolder folder) throws ArchivesModelException {
 		IJavaProject jp = JavaCore.create(project);
 		if( jp != null ) {
 			try {
@@ -127,7 +130,7 @@
 			}
 		}
 	}
-	protected void addWebinfFileset(IProject project, IArchiveFolder folder) {
+	protected void addWebinfFileset(IProject project, IArchiveFolder folder) throws ArchivesModelException {
 		try {
 			IPath projectPath = project.getLocation();
 			DirectoryScanner scanner = 
@@ -147,7 +150,7 @@
 	}
 	
 	// Lib support
-	protected void addLibFileset(IProject project, IArchiveFolder folder, boolean includeTopLevelJars) {
+	protected void addLibFileset(IProject project, IArchiveFolder folder, boolean includeTopLevelJars) throws ArchivesModelException {
 		// Let us find /WEB-INF/lib directory and set it as source for the file set.
 		String sourcePath = null;
 		
@@ -178,7 +181,7 @@
 			}
 		}
 	}
-	protected void addReferencedProjectsAsLibs(IProject project, IArchiveFolder folder) {
+	protected void addReferencedProjectsAsLibs(IProject project, IArchiveFolder folder) throws ArchivesModelException {
 		IJavaProject jp = JavaCore.create(project);
 		if( jp != null && jp.exists()) {
 			try {
@@ -199,7 +202,7 @@
 	}
 	
 	
-	protected void createLibFromProject(IProject project, IArchiveFolder folder) {
+	protected void createLibFromProject(IProject project, IArchiveFolder folder) throws ArchivesModelException {
 		IArchive pack = createGenericIArchive(project, null, project.getName() + ".jar");
 		folder.addChild(pack);
 	}

Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/modules/ArchivesBuildListener.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/modules/ArchivesBuildListener.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/modules/ArchivesBuildListener.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -63,7 +63,7 @@
 	
 	public ArchivesBuildListener() {
 		ArchivesModel.instance().addBuildListener(this);
-		ArchivesModel.instance().addModelListener(this, ArchivesModel.LIST_FRONT);
+		ArchivesModel.instance().addModelListener(this); // ? , ArchivesModel.LIST_FRONT);
 	}
 	
 	public void cleanArchive(IArchive pkg) {

Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/modules/ArchivesModelModuleContributor.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/modules/ArchivesModelModuleContributor.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/modules/ArchivesModelModuleContributor.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -28,11 +28,15 @@
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.wst.server.core.IModule;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
-import org.jboss.ide.eclipse.archives.core.model.ArchivesModelCore;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
+import org.jboss.ide.eclipse.archives.core.util.ModelUtil;
+import org.jboss.ide.eclipse.as.core.JBossServerCorePlugin;
 import org.jboss.ide.eclipse.as.core.modules.PackageModuleFactory.IModuleContributor;
 import org.jboss.ide.eclipse.as.core.modules.PackageModuleFactory.PackagedModuleDelegate;
 
@@ -68,18 +72,26 @@
 			int size = projects2.length;
 			for (int i = 0; i < size; i++) {
 				if (projects2[i].isAccessible()) {
-					createModules(projects2[i]);
+					try {
+						createModules(projects2[i]);
+					} catch(ArchivesModelException ame) {
+						IStatus status = new Status(IStatus.ERROR, JBossServerCorePlugin.PLUGIN_ID, ame.getMessage(), ame);
+						JBossServerCorePlugin.getDefault().getLog().log(status);
+					}
 				}
 			}
 		}
 		return modules.toArray(new IModule[modules.size()]);
 	}
 	
-	protected void createModules(IProject project) {
-		IArchive[] packs = ArchivesModelCore.getProjectPackages(project.getLocation(), null, false);
+	protected void createModules(IProject project) throws ArchivesModelException {
+		IArchive[] packs = ModelUtil.getProjectArchives(project.getLocation());
 		if( packs != null && packs.length > 0 ) {
 			IModule module;
-			IArchive[] packages = ArchivesModelCore.getProjectPackages(project.getLocation(), new NullProgressMonitor(), true);
+			if( !ArchivesModel.instance().isProjectRegistered(project.getLocation())) {
+				ArchivesModel.instance().registerProject(project.getLocation(), new NullProgressMonitor());
+			}
+			IArchive[] packages = ModelUtil.getProjectArchives(project.getLocation());
 			boolean requiresSave = ensureArchivesHaveIDs(project, packages);
 			ArrayList<IModule> mods = new ArrayList<IModule>();
 			for( int i = 0; i < packages.length; i++ ) {
@@ -92,8 +104,12 @@
 			}
 			projectToModules.put(project.getLocation(), mods);
 			if( requiresSave )
-				ArchivesModel.instance().saveModel(project.getLocation(), 
-						new NullProgressMonitor());
+				try {
+					ArchivesModel.instance().save(project.getLocation(), 
+							new NullProgressMonitor());
+				} catch( ArchivesModelException ame ) {
+					
+				}
 		}
 	}
 	
@@ -126,7 +142,12 @@
 				}
 			}
 		}
-		createModules(findProject(projectLoc));
+		try {
+			createModules(findProject(projectLoc));
+		} catch( ArchivesModelException ame ) {
+			IStatus status = new Status(IStatus.ERROR, JBossServerCorePlugin.PLUGIN_ID, ame.getMessage(), ame);
+			JBossServerCorePlugin.getDefault().getLog().log(status);
+		}
 	}
 
 	protected IProject findProject(IPath projectLoc) {

Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/packages/ArchivePublishWizard.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/packages/ArchivePublishWizard.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/packages/ArchivePublishWizard.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -24,6 +24,7 @@
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.as.core.modules.ArchivesBuildListener;
 import org.jboss.ide.eclipse.as.core.server.IDeployableServer;
@@ -42,7 +43,11 @@
 			pack.setProperty(ArchivesBuildListener.DEPLOY_SERVERS, getServers());
 			pack.setProperty(ArchivesBuildListener.DEPLOY_AFTER_BUILD, getAutoDeploy());
 			IPath p = pack.getProjectPath();
-			ArchivesModel.instance().saveModel(p, null);
+			try {
+				ArchivesModel.instance().save(p, null);
+			} catch( ArchivesModelException ame ) {
+				// TODO
+			}
 		}
 		return true;
 	}

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/WorkspaceChangeListener.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/WorkspaceChangeListener.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/WorkspaceChangeListener.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -39,6 +39,9 @@
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveModel;
+import org.jboss.ide.eclipse.archives.core.model.IArchivesLogger;
 
 /**
  * Update the model if someone changes the packaging file by hand
@@ -56,7 +59,7 @@
 				delta.accept(new IResourceDeltaVisitor() {
 					public boolean visit(IResourceDelta delta) throws CoreException {
 						if( delta.getResource() != null && delta.getResource().getLocation() != null && 
-								delta.getResource().getLocation().lastSegment().equals(ArchivesModel.PROJECT_PACKAGES_FILE)) {
+								delta.getResource().getLocation().lastSegment().equals(IArchiveModel.DEFAULT_PACKAGES_FILE)) {
 							projects.add(delta.getResource().getProject());
 						}
 						return true;
@@ -70,18 +73,22 @@
 			final IProject p = i.next();
 			try {
 				if( p.getSessionProperty(new QualifiedName(ArchivesCorePlugin.PLUGIN_ID, "localname")) == null ) {
-					ArchivesModel.instance().registerProject(p.getLocation(), new NullProgressMonitor());
-					new Job("Refresh Project: " + p.getName()) {
-						protected IStatus run(IProgressMonitor monitor) {
-							try {
-								p.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
-							} catch( CoreException e ) {
-								IStatus status = new Status(IStatus.WARNING, ArchivesCorePlugin.PLUGIN_ID, "Could not refresh project " + p.getName(), e);
-								return status;
+					try {
+						ArchivesModel.instance().registerProject(p.getLocation(), new NullProgressMonitor());
+						new Job("Refresh Project: " + p.getName()) {
+							protected IStatus run(IProgressMonitor monitor) {
+								try {
+									p.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
+								} catch( CoreException e ) {
+									IStatus status = new Status(IStatus.WARNING, ArchivesCorePlugin.PLUGIN_ID, "Could not refresh project " + p.getName(), e);
+									return status;
+								}
+								return Status.OK_STATUS;
 							}
-							return Status.OK_STATUS;
-						}
-					}.schedule();
+						}.schedule();
+					} catch( ArchivesModelException ame ) {
+						ArchivesCore.getInstance().getLogger().log(IArchivesLogger.MSG_ERR, "Could not register project " + p.getName(), ame);
+					}
 				}
 			} catch( CoreException ce ) {
 			}

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/build/ModelChangeListenerWithRefresh.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/build/ModelChangeListenerWithRefresh.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/build/ModelChangeListenerWithRefresh.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -10,8 +10,8 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.QualifiedName;
 import org.jboss.ide.eclipse.archives.core.ArchivesCorePlugin;
-import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveModel;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
 
 /**
@@ -48,7 +48,7 @@
 				}
 				
 				try {
-					proj.getFile(new Path(ArchivesModel.PROJECT_PACKAGES_FILE)).refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor());
+					proj.getFile(new Path(IArchiveModel.DEFAULT_PACKAGES_FILE)).refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor());
 				} catch( CoreException ce ) {
 				}
 			} catch( CoreException ce ) {

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/model/types/WorkspaceJARArchiveType.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/model/types/WorkspaceJARArchiveType.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/model/types/WorkspaceJARArchiveType.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -12,6 +12,7 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
 import org.jboss.ide.eclipse.archives.core.ArchivesCore;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFileSet;
 import org.jboss.ide.eclipse.archives.core.model.internal.ArchiveFileSetImpl;
@@ -62,7 +63,10 @@
 		classes.setSourcePath(outputContainer.getFullPath());
 		classes.setInWorkspace(true);
 		
-		jar.addChild(classes);
+		try {
+			jar.addChild(classes);
+		} catch( ArchivesModelException ame ) {
+		}
 		
 		monitor.worked(1);
 		monitor.done();

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/project/ArchivesBuilder.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/project/ArchivesBuilder.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/project/ArchivesBuilder.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -40,6 +40,7 @@
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFileSet;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveModel;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveModelNode;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNodeVisitor;
@@ -122,7 +123,7 @@
 								
 								// ignore the packages project. that will it's own build call, 
 								// or will handle the change in some other way
-								if( !delta.getResource().equals(proj.findMember(ArchivesModel.PROJECT_PACKAGES_FILE))) 
+								if( !delta.getResource().equals(proj.findMember(IArchiveModel.DEFAULT_PACKAGES_FILE))) 
 									addedChanged.add(delta.getResource().getLocation());
 							} else if( (delta.getKind() & IResourceDelta.REMOVED ) > 0 ) {
 								removed.add(delta.getResource().getLocation());

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ant/IsolatedAntExecution.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ant/IsolatedAntExecution.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ant/IsolatedAntExecution.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -15,7 +15,7 @@
 import org.apache.tools.ant.taskdefs.War;
 import org.apache.tools.ant.taskdefs.Zip;
 import org.apache.tools.ant.types.ZipFileSet;
-import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveModel;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -33,7 +33,7 @@
     /**
      * Packages file defaults to ".packages"
      */
-    private String jbossPackages = ArchivesModel.PROJECT_PACKAGES_FILE;
+    private String jbossPackages = IArchiveModel.DEFAULT_PACKAGES_FILE;
     private JBossArchivesTask parentTask;
 
     public IsolatedAntExecution(JBossArchivesTask parent) {

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ant/IsolatedTruezipExecution.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ant/IsolatedTruezipExecution.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ant/IsolatedTruezipExecution.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -9,6 +9,7 @@
 import org.jboss.ide.eclipse.archives.core.ArchivesCore;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModelCore;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveBuildListener;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFileSet;
@@ -57,7 +58,11 @@
 		
 		if( ArchivesModel.instance().getRoot(path) == null) {
 			task.log("Registering project: " + path + ". ", Project.MSG_VERBOSE);
-			ArchivesModel.instance().registerProject(path, null);			
+			try {
+				ArchivesModel.instance().registerProject(path, null);
+			} catch( ArchivesModelException ame ) {
+				// log it
+			}
 		}
 		
 		IArchiveModelNode node = ArchivesModel.instance().getRoot(path);

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/build/ModelChangeListener.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/build/ModelChangeListener.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/build/ModelChangeListener.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -81,7 +81,7 @@
 		if( isTopLevelArchive(delta.getPostNode())) 
 			EventManager.startedBuildingArchive((IArchive)delta.getPostNode());
 
-		if( (delta.getKind() & IArchiveNodeDelta.UNKNOWN_CHANGE) != 0 ) {
+		if( (delta.getKind() & (IArchiveNodeDelta.NODE_REGISTERED | IArchiveNodeDelta.UNKNOWN_CHANGE)) != 0 ) {
 			nodeRemoved(delta.getPreNode());
 			nodeAdded(delta.getPostNode());
 		} if( (delta.getKind() & IArchiveNodeDelta.REMOVED) != 0 ) {

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModel.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModel.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModel.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -21,18 +21,12 @@
  */
 package org.jboss.ide.eclipse.archives.core.model;
 
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
 
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.jboss.ide.eclipse.archives.core.ArchivesCore;
 import org.jboss.ide.eclipse.archives.core.model.internal.ArchiveModelNode;
 import org.jboss.ide.eclipse.archives.core.model.internal.xb.XMLBinding;
@@ -46,18 +40,13 @@
  * 
  * @author <a href="rob.stryker at redhat.com">Rob Stryker</a>
  */
-public class ArchivesModel implements IArchiveModelListenerManager {
+public class ArchivesModel implements IArchiveModel {
 	
 	/**
-	 * The packages file name
-	 */
-	public static final String PROJECT_PACKAGES_FILE = ".packages";
-	
-	/**
 	 * Singleton instance
 	 */
-	protected static ArchivesModel instance;
-	public static ArchivesModel instance() {
+	protected static IArchiveModel instance;
+	public static IArchiveModel instance() {
 		if( instance == null ) 
 			instance = new ArchivesModel();
 		return instance;
@@ -74,199 +63,165 @@
 		modelListeners = new ArrayList<IArchiveModelListener>();
 	}
 	
-	
-	public static final int LIST_FRONT = 0;
-	public static final int LIST_BACK = -1;
-	
 	/*
-	 * Listeners
+	 * (non-Javadoc)
+	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveModel#addBuildListener(org.jboss.ide.eclipse.archives.core.model.IArchiveBuildListener)
 	 */
 	public void addBuildListener(IArchiveBuildListener listener) {
 		if( !buildListeners.contains(listener)) 
 			buildListeners.add(listener);
 	}
-	public void addBuildListener(IArchiveBuildListener listener, int loc) {
-		if( !buildListeners.contains(listener)) {
-			if( loc == LIST_FRONT )
-				buildListeners.add(0, listener);
-			else
-				buildListeners.add(listener);				
-		}
-	}
 	
+	/*
+	 * (non-Javadoc)
+	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveModel#removeBuildListener(org.jboss.ide.eclipse.archives.core.model.IArchiveBuildListener)
+	 */
 	public void removeBuildListener(IArchiveBuildListener listener) {
 		buildListeners.remove(listener);
 	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveModel#getBuildListeners()
+	 */
 	public IArchiveBuildListener[] getBuildListeners() {
 		return buildListeners.toArray(new IArchiveBuildListener[buildListeners.size()]);
 	}
 	
+	/*
+	 * (non-Javadoc)
+	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveModel#addModelListener(org.jboss.ide.eclipse.archives.core.model.IArchiveModelListener)
+	 */
 	public void addModelListener(IArchiveModelListener listener) {
 		if( !modelListeners.contains(listener)) 
 			modelListeners.add(listener);
 	}
-	public void addModelListener(IArchiveModelListener listener, int loc) {
-		if( !modelListeners.contains(listener)) {
-			if( loc == LIST_FRONT )
-				modelListeners.add(0, listener);
-			else
-				modelListeners.add(listener);				
-		}
-	}
-	
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveModel#removeModelListener(org.jboss.ide.eclipse.archives.core.model.IArchiveModelListener)
+	 */
 	public void removeModelListener(IArchiveModelListener listener) {
 		if( modelListeners.contains(listener)) 
 			modelListeners.remove(listener);
 	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveModel#getModelListeners()
+	 */
 	public IArchiveModelListener[] getModelListeners() {
 		return modelListeners.toArray(new IArchiveModelListener[modelListeners.size()]);
 	}
-
 	
-	
-	
-	
-	
-	public XbPackages getXbPackages(IPath project) {
-		return (xbPackages.get(project));
-	}
-	
-	/**
-	 * If the project hasn't been registered, register it
-	 * @param project
-	 * @param monitor
-	 * @return
+	/*
+	 * (non-Javadoc)
+	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveModel#getModelNodes()
 	 */
-	public XbPackages getXbPackages(IPath project, IProgressMonitor monitor) {
-		if( !xbPackages.containsKey(project)) 
-			registerProject(project, monitor);
-		return (xbPackages.get(project));
+	public IArchiveModelNode[] getModelNodes() {
+		Collection<ArchiveModelNode> c = archivesRoot.values();
+		return (IArchiveModelNode[]) c.toArray(new IArchiveModelNode[c.size()]);
 	}
 	
-	/**
-	 * Accept a visitor
+	/*
+	 * (non-Javadoc)
+	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveModel#accept(org.jboss.ide.eclipse.archives.core.model.IArchiveNodeVisitor)
 	 */
 	public boolean accept(IArchiveNodeVisitor visitor) {
-		IArchiveNode children[] = getAllArchives();
+		IArchiveModelNode[] children = getModelNodes();
 		boolean keepGoing = true;
-
-		if (keepGoing) {
-			for (int i = 0; i < children.length; i++) {
-				if (keepGoing) {
+		if (keepGoing)
+			for (int i = 0; i < children.length; i++)
+				if (keepGoing)
 					keepGoing = children[i].accept(visitor);
-				}
-			}
-		}
-		
 		return keepGoing;
 	}	
-	
-	/**
-	 * Gets every single *registered* model
-	 * @return
-	 */
-	protected ArchiveModelNode[] getAllArchives() {
-		ArchiveModelNode[] ret = new ArchiveModelNode[archivesRoot.keySet().size()];
-		Iterator<IPath> i = archivesRoot.keySet().iterator();
-		int x = 0;
-		while(i.hasNext()) {
-			ret[x++] = archivesRoot.get(i.next());
-		}
-		return ret;
+
+
+	public IArchiveModelNode getRoot(IPath project) {
+		return (archivesRoot.get(project));
 	}
 	
-	/**
-	 * Get the root node for this object
-	 * @param project
-	 * @return
-	 */
-	public IArchiveModelNode getRoot(IPath project) {
-		return getRoot(project, false, new NullProgressMonitor());
+	@Deprecated
+	public void save(IPath projectPath, IProgressMonitor monitor) throws ArchivesModelException {
+		save(getRoot(projectPath), monitor);
 	}
 	
-	public IArchiveModelNode getRoot(IPath project, boolean register, IProgressMonitor monitor) {
-		if( archivesRoot.get(project) == null && register ) {
-			registerProject(project, monitor);
-		}
-		return (archivesRoot.get(project));
+	@Deprecated
+	public void save(IArchiveModelNode modelNode, IProgressMonitor monitor) throws ArchivesModelException {
+		modelNode.save(monitor);
 	}
 	
-	public IArchive[] getProjectArchives(IPath project) {
-		return getProjectArchives(project, false, new NullProgressMonitor());
+	public boolean isProjectRegistered(IPath projectPath) {
+		return archivesRoot.containsKey(projectPath);
 	}
-	public IArchive[] getProjectArchives(IPath project, boolean register, IProgressMonitor monitor) {
-		IArchiveModelNode root = getRoot(project, register, monitor);
-		if( root != null ) {
-			List<IArchiveNode> list = Arrays.asList( getRoot(project, register, monitor).getAllChildren());
-			return list.toArray(new IArchive[list.size()]);
-		} else if( register) {
-			registerProject(project, monitor);
-			List<IArchiveNode> list = Arrays.asList( getRoot(project, register, monitor).getAllChildren());
-			return list.toArray(new IArchive[list.size()]);
-		} else {
-			return new IArchive[] {};
-		}
-	}
 	
-	// to make sure the node root is actually in the model
-	public boolean containsRoot(ArchiveModelNode node) {
-		return archivesRoot.containsValue(node);
+	public IArchiveModelNode registerProject(IPath projectPath, IProgressMonitor monitor) throws ArchivesModelException {
+		return registerProject(projectPath, DEFAULT_PACKAGES_FILE, monitor);
 	}
 	
-	public void registerProject(IPath project, IProgressMonitor monitor) {
-		// if the file exists, read it in
-		if( monitor == null ) monitor = new NullProgressMonitor();
-		monitor.beginTask("Loading configuration...", XMLBinding.NUM_UNMARSHAL_MONITOR_STEPS + 2);
-		
-		ArchivesCore.getInstance().preRegisterProject(project);
-		
-		ArchiveModelNode root;
-		Exception e = null;
-		IPath packagesFile = project.append(PROJECT_PACKAGES_FILE);
+	public IArchiveModelNode registerProject(IPath projectPath, String file, IProgressMonitor monitor) throws ArchivesModelException {
+		XbPackages packages;
+		ArchiveModelNode modelNode;
+
+		IPath packagesFile = projectPath.append(file);
 		if (packagesFile.toFile().exists()) {
-			XbPackages packages = null;
 			try {
-				FileInputStream is = new FileInputStream(packagesFile.toFile());
-				packages = XMLBinding.unmarshal(is, monitor);
-				monitor.worked(1);
-			} catch (FileNotFoundException f) {
-				e = f;
-			} catch( XbException xbe) {
-				e = xbe;
-			}
-				
-			if (packages == null) {
+				packages = XMLBinding.unmarshal(packagesFile.toFile(), monitor);
+			} catch( XbException xbe ) {
 				// Empty / non-working XML file loaded
-				ArchivesCore.getInstance().getLogger().log(IArchivesLogger.MSG_ERR, "Could not unmarshall packages file", e);
-				return;
+				ArchivesCore.getInstance().getLogger().log(IArchivesLogger.MSG_ERR, "Error unmarshalling packages file " + packagesFile, xbe);
+				return null;
 			}
-			
-			root = new ArchiveModelNode(project, packages, this);
-			ArchiveModelNode oldRoot = archivesRoot.get(project);
-			xbPackages.put(project, packages);
-			archivesRoot.put(project, root);
-			ModelUtil.fillArchiveModel(packages, (ArchiveModelNode)getRoot(project));
-			root.clearDeltas();
-			fireRegisterProjectEvent(oldRoot, root);
-			monitor.worked(1);
 		} else {
-			// file not found, just create some default xbpackages and insert them
-			XbPackages packages = new XbPackages();
-			ArchiveModelNode root2 = new ArchiveModelNode(project, packages, this);
-			xbPackages.put(project, packages);
-			archivesRoot.put(project, root2);
-			fireRegisterProjectEvent(null, root2);
+			packages = new XbPackages();
 		}
+		
+		// Fill the model
+		modelNode = new ArchiveModelNode(projectPath, projectPath.append(file), packages, this);
+		ModelUtil.fillArchiveModel(packages, modelNode);
+		modelNode.clearDelta();
+		
+		registerProject(modelNode, monitor);
+		return modelNode;
 	}
 	
-	protected void fireRegisterProjectEvent(final ArchiveModelNode oldRoot, final ArchiveModelNode newRoot) {
+	public void registerProject(IArchiveModelNode model, IProgressMonitor monitor) {
+		ArchivesCore.getInstance().preRegisterProject(model.getProjectPath());
+		xbPackages.put(model.getProjectPath(), ((ArchiveModelNode)model).getXbPackages());
+		archivesRoot.put(model.getProjectPath(), (ArchiveModelNode)model);
+		fireRegisterProjectEvent((ArchiveModelNode)model);
+	}
+	
+	public void unregisterProject(IPath projectPath, IProgressMonitor monitor) {
+		IArchiveModelNode root = getRoot(projectPath);
+		xbPackages.remove(projectPath);
+		archivesRoot.remove(projectPath);
+		fireUnregisterProjectEvent(root);
+	}
+
+	public void unregisterProject(IArchiveModelNode model, IProgressMonitor monitor) {
+		xbPackages.remove(model.getProjectPath());
+		archivesRoot.remove(model.getProjectPath());
+		fireUnregisterProjectEvent((ArchiveModelNode)model);
+	}
+	
+	protected void fireRegisterProjectEvent(final IArchiveModelNode newRoot) {
+		fireRegistrationEvent(null, newRoot, IArchiveNodeDelta.NODE_REGISTERED);
+	}
+	
+	protected void fireUnregisterProjectEvent(final IArchiveModelNode oldRoot) {
+		fireRegistrationEvent(oldRoot, null, IArchiveNodeDelta.NODE_UNREGISTERED);
+	}
+	
+	protected void fireRegistrationEvent(final IArchiveModelNode oldRoot, final IArchiveModelNode newRoot, final int type) {
 		IArchiveNodeDelta delta = new IArchiveNodeDelta() {
 			public IArchiveNodeDelta[] getAddedChildrenDeltas() {return null;}
 			public IArchiveNodeDelta[] getAllAffectedChildren() {return null;}
 			public INodeDelta getAttributeDelta(String key) {return null;}
 			public String[] getAttributesWithDeltas() {return null;}
 			public IArchiveNodeDelta[] getChangedDescendentDeltas() {return null;}
-			public int getKind() {return IArchiveNodeDelta.UNKNOWN_CHANGE;}
+			public int getKind() {return type;}
 			public IArchiveNode getPostNode() {return newRoot;}
 			public IArchiveNode getPreNode() { return oldRoot; }
 			public String[] getPropertiesWithDeltas() {return null;}
@@ -275,43 +230,4 @@
 		};
 		EventManager.fireDelta(delta);
 	}
-	
-
-	public void saveModel (IPath project, IProgressMonitor monitor) {
-		// get a list of dirty nodes
-		
-		if (monitor == null)
-			monitor = new NullProgressMonitor();
-		
-		IPath packagesFile = project.append(ArchivesModel.PROJECT_PACKAGES_FILE);
-		XbPackages packs = getXbPackages(project);
-		try {
-			XMLBinding.marshallToFile(packs, packagesFile, monitor);
-		} catch( IOException ioe ) {
-			ArchivesCore.getInstance().getLogger().log(IArchivesLogger.MSG_ERR, "Could not marshall packages file", ioe);
-			return;
-		} catch( XbException xbe ) {
-			ArchivesCore.getInstance().getLogger().log(IArchivesLogger.MSG_ERR, "Could not marshall packages file", xbe);
-			return;
-		}
-		
-		// get deltas
-		ArchiveModelNode root = (ArchiveModelNode)getRoot(project);
-		IArchiveNodeDelta delta = root.getDelta();
-		
-		// clear deltas
-		root.clearDeltas();
-		
-		// fire delta events
-		EventManager.fireDelta(delta);
-	}
-
-	// TODO: This requires massive help and new API's as well. 
-	public void attach(IArchiveNode parent, IArchiveNode child, IProgressMonitor monitor) {
-		parent.addChild(child);
-		if( parent.connectedToModel() && parent.getProjectPath() != null) {
-			// save
-			saveModel(parent.getProjectPath(), monitor);
-		}
-	}
 }

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModelCore.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModelCore.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModelCore.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -37,7 +37,6 @@
  */
 public class ArchivesModelCore {
 	
-	
 	/**
 	 * Builds all of a project's packages. Note that this does not call any builders before or after the package builder (i.e. the JDT builder).
 	 * If you are looking to run all the builders on a project use project.build()
@@ -59,36 +58,14 @@
 		new ArchiveBuildDelegate().fullArchiveBuild(pkg);
 	}
 	
-	public static IArchive[] getProjectPackages (IPath project, IProgressMonitor monitor, boolean forceInit) {
-		return ArchivesModel.instance().getProjectArchives(project, forceInit, monitor);
-	}
-
 	public static boolean packageFileExists (IPath project) {
-		return project.append(ArchivesModel.PROJECT_PACKAGES_FILE).toFile().exists();
+		return project.append(IArchiveModel.DEFAULT_PACKAGES_FILE).toFile().exists();
 	}
 	
 	public static boolean projectRegistered(IPath project) {
 		return ArchivesModel.instance().getRoot(project) == null ? false : true;
 	}
 
-	
-	/**
-	 * Visit all of the top-level packages in the passed in project with the passed in node visitor
-	 * @param project The project whose packages to visit
-	 * @param visitor The visitor
-	 */
-	public static void visitProjectArchives (IPath project, IArchiveNodeVisitor visitor) {
-		if (packageFileExists(project)) {
-			IArchive packages[] = getProjectPackages(project, null, false);
-			if( packages == null ) return;
-			for (int i = 0; i < packages.length; i++) {
-				boolean keepGoing = packages[i].accept(visitor);
-				if (!keepGoing) break;
-			}
-		}
-	}
-
-	
 	public static IPath[] findMatchingPaths(IPath root, String includes, String excludes) {
 		try {
 			if(root==null) return new IPath[0];

Added: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModelException.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModelException.java	                        (rev 0)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModelException.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -0,0 +1,51 @@
+/**
+ * JBoss, a Division of Red Hat
+ * Copyright 2006, Red Hat Middleware, LLC, 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.ide.eclipse.archives.core.model;
+
+/**
+ * @author rob.stryker <rob.stryker at redhat.com>
+ *
+ */
+public class ArchivesModelException extends Exception {
+	private Exception parent;
+
+	public ArchivesModelException(String message) {
+		super(message);
+	}
+	
+	public ArchivesModelException(Exception e) {
+		super();
+		parent = e;
+	}
+	public Exception getException() {
+		return parent;
+	}
+	public String getMessage() {
+		return getMessage() != null ? getMessage() :   
+				parent.getCause() == null ? parent.getMessage() : 
+					parent.getCause().getMessage();
+	}
+	public Throwable getCause() {
+		return parent;
+	}
+
+}

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/EventManager.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/EventManager.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/EventManager.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -176,9 +176,9 @@
 
 	
 	private static IArchiveModelListener[] getModelListeners(IArchiveNode node) {
-		IArchiveModelNode model = node.getModel();
-		if( model != null && model.getManager() != null ) {
-			return model.getManager().getModelListeners();
+		IArchiveModelNode model = node.getModelNode();
+		if( model != null && model.getModel() != null ) {
+			return model.getModel().getModelListeners();
 		}
 		return new IArchiveModelListener[]{};
 	}
@@ -188,9 +188,9 @@
 		return ArchivesModel.instance().getBuildListeners();
 	}
 	private static IArchiveBuildListener[] getBuildListeners(IArchiveNode node) {
-		IArchiveModelNode model = node.getModel();
-		if( model != null && model.getManager() != null ) {
-			return model.getManager().getBuildListeners();
+		IArchiveModelNode model = node.getModelNode();
+		if( model != null && model.getModel() != null ) {
+			return model.getModel().getBuildListeners();
 		}
 		return new IArchiveBuildListener[]{};
 	}

Copied: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModel.java (from rev 6560, trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModelListenerManager.java)
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModel.java	                        (rev 0)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModel.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -0,0 +1,56 @@
+/**
+ * JBoss, a Division of Red Hat
+ * Copyright 2006, Red Hat Middleware, LLC, 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.ide.eclipse.archives.core.model;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.jboss.ide.eclipse.archives.core.model.internal.xb.XMLBinding.XbException;
+
+
+/**
+ * Manages Archive Model Listeners, build and model changes, for changes
+ * in the model
+ * @author rstryker
+ *
+ */
+public interface IArchiveModel {
+	public static final String DEFAULT_PACKAGES_FILE = ".packages";
+
+	public boolean isProjectRegistered(IPath projectPath);
+	public void save(IPath projectPath, IProgressMonitor monitor) throws ArchivesModelException;
+	public void save(IArchiveModelNode modelNode, IProgressMonitor monitor) throws ArchivesModelException;
+	public IArchiveModelNode registerProject(IPath projectPath, IProgressMonitor monitor) throws ArchivesModelException;
+	public IArchiveModelNode registerProject(IPath projectPath, String file, IProgressMonitor monitor) throws ArchivesModelException;
+	public void registerProject(IArchiveModelNode modelNode, IProgressMonitor monitor);
+	public void unregisterProject(IPath projectPath, IProgressMonitor monitor);
+	public void unregisterProject(IArchiveModelNode modelNode, IProgressMonitor monitor);
+	public IArchiveModelNode getRoot(IPath project);
+	public IArchiveModelNode[] getModelNodes();
+	public boolean accept(IArchiveNodeVisitor visitor);
+	
+	public void addBuildListener(IArchiveBuildListener listener);
+	public void removeBuildListener(IArchiveBuildListener listener);
+	public IArchiveBuildListener[] getBuildListeners();
+	public void addModelListener(IArchiveModelListener listener);
+	public void removeModelListener(IArchiveModelListener listener);
+	public IArchiveModelListener[] getModelListeners();
+}

Deleted: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModelListenerManager.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModelListenerManager.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModelListenerManager.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -1,40 +0,0 @@
-/**
- * JBoss, a Division of Red Hat
- * Copyright 2006, Red Hat Middleware, LLC, 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.ide.eclipse.archives.core.model;
-
-
-/**
- * Manages Archive Model Listeners, build and model changes, for changes
- * in the model
- * @author rstryker
- *
- */
-public interface IArchiveModelListenerManager {
-
-	public void addBuildListener(IArchiveBuildListener listener);
-	public void removeBuildListener(IArchiveBuildListener listener);
-	public IArchiveBuildListener[] getBuildListeners();
-	public void addModelListener(IArchiveModelListener listener);
-	public void removeModelListener(IArchiveModelListener listener);
-	public IArchiveModelListener[] getModelListeners();
-
-}

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModelNode.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModelNode.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveModelNode.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -21,6 +21,10 @@
  */
 package org.jboss.ide.eclipse.archives.core.model;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.jboss.ide.eclipse.archives.core.model.internal.xb.XMLBinding.XbException;
+
+
 /**
  * An interface for methods relevent to a model's root node.
  * Only a label interface thus far
@@ -28,5 +32,6 @@
  *
  */
 public interface IArchiveModelNode extends IArchiveNode {
-	public IArchiveModelListenerManager getManager();
+	public IArchiveModel getModel();
+	public void save(IProgressMonitor monitor) throws ArchivesModelException;
 }

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveNode.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveNode.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveNode.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -132,7 +132,7 @@
 	 * Add a child node to this node
 	 * @param child The child to add
 	 */
-	public void addChild(IArchiveNode child);
+	public void addChild(IArchiveNode child) throws ArchivesModelException;
 	
 	/**
 	 * Remove a child node from this node
@@ -150,15 +150,9 @@
 	 * Get the model this node is attached to, or null if none
 	 * @return
 	 */
-	public IArchiveModelNode getModel();
-	
+	public IArchiveModelNode getModelNode();
+
 	/**
-	 * Is the root of this node a PackageModelNode and registered in ArchivesModel?
-	 * @return
-	 */
-	public boolean connectedToModel();
-	
-	/**
 	 * Get the path relative to the root archive
 	 * @return
 	 */
@@ -169,9 +163,16 @@
 	 * @return
 	 */
 	public IArchive getRootArchive();
+
 	/**
 	 * Get the current delta
 	 * @return
 	 */
 	public IArchiveNodeDelta getDelta();
+
+	/**
+	 * Clear the current delta
+	 * @return
+	 */
+	public void clearDelta();
 }

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveNodeDelta.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveNodeDelta.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/IArchiveNodeDelta.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -86,11 +86,23 @@
 	public static final int DESCENDENT_CHANGED 	= 0x400;
 	
 	/**
-	 * An unknown change has occurred. Best to reshow the entire module
+	 * The node was registered with a model
 	 */
-	public static final int UNKNOWN_CHANGE = 0x800;
+	public static final int NODE_REGISTERED = 0x800;
+
+	/**
+	 * The node was unregistered with a model
+	 */
+	public static final int NODE_UNREGISTERED = 0x1000;
 	
 	/**
+	 * An unknown change has occurred. This may include
+	 * any (or multiple) events and may require an observer
+	 * to re-scan the entire node / tree for changes. 
+	 */
+	public static final int UNKNOWN_CHANGE = 0x1000;
+
+	/**
 	 * Return the delta kind
 	 * @return
 	 */

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveDeltaPreNodeFactory.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveDeltaPreNodeFactory.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveDeltaPreNodeFactory.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -166,8 +166,8 @@
 		public IPath getProjectPath() {
 			return impl.getProjectPath();
 		}
-		public IArchiveModelNode getModel() {
-			return impl.getModel();
+		public IArchiveModelNode getModelNode() {
+			return impl.getModelNode();
 		}
 	}
 	
@@ -188,8 +188,8 @@
 		public IPath getProjectPath() {
 			return impl.getProjectPath();
 		}
-		public IArchiveModelNode getModel() {
-			return impl.getModel();
+		public IArchiveModelNode getModelNode() {
+			return impl.getModelNode();
 		}
 	}
 	
@@ -210,8 +210,8 @@
 		public IPath getProjectPath() {
 			return impl.getProjectPath();
 		}
-		public IArchiveModelNode getModel() {
-			return impl.getModel();
+		public IArchiveModelNode getModelNode() {
+			return impl.getModelNode();
 		}
 	}
 }

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveModelNode.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveModelNode.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveModelNode.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -22,31 +22,44 @@
 package org.jboss.ide.eclipse.archives.core.model.internal;
 
 import org.eclipse.core.runtime.IPath;
-import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
+import org.jboss.ide.eclipse.archives.core.model.EventManager;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
-import org.jboss.ide.eclipse.archives.core.model.IArchiveModelListenerManager;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveModel;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveModelNode;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
-import org.jboss.ide.eclipse.archives.core.model.internal.xb.XbPackageNodeWithProperties;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveNodeDelta;
+import org.jboss.ide.eclipse.archives.core.model.internal.xb.XMLBinding;
 import org.jboss.ide.eclipse.archives.core.model.internal.xb.XbPackages;
+import org.jboss.ide.eclipse.archives.core.model.internal.xb.XMLBinding.XbException;
 
 public class ArchiveModelNode extends ArchiveNodeImpl implements IArchiveModelNode {
 	private IPath project;
-	private IArchiveModelListenerManager manager;
+	private IPath descriptor;
+	private IArchiveModel model;
 	
-	public ArchiveModelNode(IPath project, XbPackages node, 
-			IArchiveModelListenerManager manager) {
+	public ArchiveModelNode(IPath project, XbPackages node, IArchiveModel model) {
+		this(project, project.append(IArchiveModel.DEFAULT_PACKAGES_FILE), node, model);
+	}
+	
+	public ArchiveModelNode(IPath project, IPath descriptor,
+			XbPackages node, IArchiveModel model) {
 		super(node);
 		this.project = project;
-		this.manager = manager;
+		this.descriptor = descriptor;
+		this.model = model;
 	}
 	
+	public IPath getDescriptor() {
+		return descriptor;
+	}
 	/*
 	 * (non-Javadoc)
 	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveModelNode#getManager()
 	 */
-	public IArchiveModelListenerManager getManager() {
-		return manager;
+	public IArchiveModel getModel() {
+		return model;
 	}
 	
 	/*
@@ -65,10 +78,10 @@
 	 * The model root can only accept IArchive's as children
 	 * @see IArchiveNode#addChild(IArchiveNode)
 	 */
-	public void addChild(IArchiveNode child) {
-		if( child instanceof IArchive ) {
-			super.addChild(child);
-		}
+	protected boolean validateChild(IArchiveNode child) {
+		if( child.getNodeType() != IArchiveNode.TYPE_ARCHIVE)
+			return false;
+		return true;
 	}
 
 	/*
@@ -92,7 +105,7 @@
 	 * @see org.jboss.ide.eclipse.archives.core.model.internal.ArchiveNodeImpl#connectedToModel()
 	 */
 	public boolean connectedToModel() {
-		return ArchivesModel.instance().containsRoot(this);
+		return getModel() != null;
 	}
 
 	/**
@@ -117,4 +130,19 @@
 	public IPath getRootArchiveRelativePath() {
 		return null;
 	}
+
+	/* (non-Javadoc)
+	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveModelNode#save(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void save(IProgressMonitor monitor) throws ArchivesModelException {
+		XbPackages packs = (XbPackages)getNodeDelegate();
+		try {
+			XMLBinding.marshallToFile(packs, getDescriptor(), monitor);
+		} catch( XbException xbe ) {
+			throw new ArchivesModelException(xbe);
+		}
+		IArchiveNodeDelta delta = getDelta();
+		clearDelta();
+		EventManager.fireDelta(delta);
+	}
 }

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveNodeDeltaImpl.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveNodeDeltaImpl.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveNodeDeltaImpl.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -26,6 +26,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNodeDelta;
 
@@ -183,10 +184,14 @@
 		if( preNode != null ) {
 			// now we've got our list of current children... set them. 
 			for( Iterator i = priorChildren.iterator(); i.hasNext(); ) {
-				preNode.addChild((IArchiveNode)i.next());
+				try {
+					preNode.addChild((IArchiveNode)i.next());
+				} catch( ArchivesModelException ame) {
+					// DO nothing
+				}
 			}
 			// now clear pre-node's deltas so it looks shiny
-			preNode.clearDeltas();
+			preNode.clearDelta();
 		}
 		
 		childrenDeltas = (IArchiveNodeDelta[]) deltas.toArray(new IArchiveNodeDelta[deltas.size()]);

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveNodeImpl.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveNodeImpl.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/ArchiveNodeImpl.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -28,7 +28,7 @@
 
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.IPath;
-import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveModelNode;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
@@ -81,7 +81,7 @@
 	 * (non-Javadoc)
 	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveNode#getModel()
 	 */
-	public IArchiveModelNode getModel() {
+	public IArchiveModelNode getModelNode() {
 		Object root = getRoot();
 		return root instanceof IArchiveModelNode ? (IArchiveModelNode)root : null;
 	}
@@ -243,7 +243,7 @@
 	 * (non-Javadoc)
 	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveNode#addChild(org.jboss.ide.eclipse.archives.core.model.IArchiveNode)
 	 */
-	public void addChild(IArchiveNode node) {
+	public void addChild(IArchiveNode node) throws ArchivesModelException {
 		addChild(node, true);
 	}
 
@@ -252,7 +252,9 @@
 	 * @param child
 	 * @param addInDelegate
 	 */
-	public void addChild(IArchiveNode child, boolean addInDelegate) {
+	public void addChild(IArchiveNode child, boolean addInDelegate) throws ArchivesModelException {
+		if( !validateChild(child) ) 
+			throw new ArchivesModelException("Unable to add child node");
 		Assert.isNotNull(child);
 		ArchiveNodeImpl childImpl = (ArchiveNodeImpl) child;
 		children.add(childImpl);
@@ -262,6 +264,10 @@
 		childChanges(child, IArchiveNodeDelta.CHILD_ADDED);
 	}
 
+	protected boolean validateChild(IArchiveNode child) {
+		return true;
+	}
+	
 	/*
 	 * (non-Javadoc)
 	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveNode#removeChild(org.jboss.ide.eclipse.archives.core.model.IArchiveNode)
@@ -283,16 +289,6 @@
 			childChanges(node, IArchiveNodeDelta.CHILD_REMOVED);
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * @see org.jboss.ide.eclipse.archives.core.model.IArchiveNode#connectedToModel()
-	 */
-	public boolean connectedToModel() {
-		IArchiveNode root = getRoot();
-		return root != null && root.getNodeType() == TYPE_MODEL && ArchivesModel.instance().containsRoot((ArchiveModelNode)root);
-	}
-	
-	
 	/**
 	 * An attribute has changed. Save the change so it can be represented in a delta
 	 */
@@ -387,7 +383,7 @@
 	/**
 	 *  Forget all past state
 	 */
-	public void clearDeltas() {
+	public void clearDelta() {
 		attributeChanges.clear();
 		propertyChanges.clear();
 		childChanges.clear();
@@ -395,6 +391,6 @@
 		// clear children recursively
 		IArchiveNode[] children = getAllChildren();
 		for( int i = 0; i < children.length; i++ ) 
-			((ArchiveNodeImpl)children[i]).clearDeltas();
+			((ArchiveNodeImpl)children[i]).clearDelta();
 	}
 }

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/xb/XMLBinding.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/xb/XMLBinding.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/xb/XMLBinding.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -22,6 +22,9 @@
 package org.jboss.ide.eclipse.archives.core.model.internal.xb;
 
 import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -97,7 +100,18 @@
 		return unmarshal(new ByteArrayInputStream(input.getBytes()), monitor);
 	}
 	
-	public static XbPackages unmarshal (final InputStream in, 
+	public static XbPackages unmarshal(File file, IProgressMonitor monitor) throws XbException {
+		try {
+			FileInputStream fis = new FileInputStream(file);
+			return unmarshal(fis, monitor);
+		} catch( FileNotFoundException fnfe ) {
+			throw new XbException(fnfe);
+		} catch( XbException xbe) {
+			throw xbe;
+		}
+	}
+	
+	protected static XbPackages unmarshal (final InputStream in, 
 				final IProgressMonitor monitor) throws XbException {
 		if( !initialized) init();
 		final XbPackages[] element = new XbPackages[1];
@@ -137,7 +151,7 @@
 		return null;
 	}
 	
-	public static void marshallToFile(XbPackages element, IPath filePath, IProgressMonitor monitor) throws XbException, IOException {
+	public static void marshallToFile(XbPackages element, IPath filePath, IProgressMonitor monitor) throws XbException {
 		OutputStreamWriter writer = null;
 		try {
 			writer = new OutputStreamWriter(new FileOutputStream(filePath.toFile()));
@@ -145,12 +159,12 @@
 		} catch( XbException xbe ) {
 			throw xbe;
 		} catch( IOException ioe ) {
-			throw ioe;
+			throw new XbException(ioe);
 		}
 		finally {
 			try {
 				if( writer != null ) writer.close();
-			} catch( IOException ioe) {throw ioe;}
+			} catch( IOException ioe) {}
 		}
 	}
 	
@@ -208,6 +222,7 @@
 	public static class XbException extends Exception {
 		private Exception parent;
 		public XbException(Exception e) {
+			super();
 			parent = e;
 		}
 		public Exception getException() {
@@ -216,5 +231,8 @@
 		public String getMessage() {
 			return parent.getCause() == null ? parent.getMessage() : parent.getCause().getMessage();
 		}
+		public Throwable getCause() {
+			return parent;
+		}
 	}
 }

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/util/ModelUtil.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/util/ModelUtil.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/util/ModelUtil.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -25,16 +25,20 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 
 import org.eclipse.core.runtime.IPath;
 import org.jboss.ide.eclipse.archives.core.ArchivesCore;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFileSet;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFolder;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveModel;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveModelNode;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNodeVisitor;
+import org.jboss.ide.eclipse.archives.core.model.IArchivesLogger;
 import org.jboss.ide.eclipse.archives.core.model.internal.ArchiveFileSetImpl;
 import org.jboss.ide.eclipse.archives.core.model.internal.ArchiveFolderImpl;
 import org.jboss.ide.eclipse.archives.core.model.internal.ArchiveImpl;
@@ -222,20 +226,24 @@
 		return projectPath.append(workspacePath.removeFirstSegments(1));
 	}
 	
-	public static void fillArchiveModel( XbPackages node, IArchiveModelNode modelNode) { 
+	public static void fillArchiveModel( XbPackages node, IArchiveModelNode modelNode) throws ArchivesModelException { 
 		for (Iterator iter = node.getAllChildren().iterator(); iter.hasNext(); ) {
 			XbPackageNode child = (XbPackageNode) iter.next();
 			ArchiveNodeImpl childImpl = (ArchiveNodeImpl)createPackageNodeImpl(child, modelNode);
 			if (modelNode != null && childImpl != null) {
-				if( modelNode instanceof ArchiveNodeImpl )
-					((ArchiveNodeImpl)modelNode).addChild(childImpl, false);
-				else
-					modelNode.addChild(childImpl);
+				try {
+					if( modelNode instanceof ArchiveNodeImpl )
+						((ArchiveNodeImpl)modelNode).addChild(childImpl, false);
+					else 
+						modelNode.addChild(childImpl);
+				} catch( ArchivesModelException ame ) {
+					ArchivesCore.getInstance().getLogger().log(IArchivesLogger.MSG_WARN, "Error Adding Child", ame);
+				}
 			}
 		}
 	}
 
-	protected static IArchiveNode createPackageNodeImpl (XbPackageNode node, IArchiveNode parent) {
+	protected static IArchiveNode createPackageNodeImpl (XbPackageNode node, IArchiveNode parent) throws ArchivesModelException {
 		ArchiveNodeImpl nodeImpl = null;
 		if (node instanceof XbPackage) {
 			nodeImpl = new ArchiveImpl((XbPackage)node);
@@ -257,4 +265,16 @@
 		return nodeImpl;
 	}
 	
+	public static IArchive[] getProjectArchives(IPath project) {
+		return getProjectArchives(project, ArchivesModel.instance());
+	}
+	
+	public static IArchive[] getProjectArchives(IPath project, IArchiveModel model) {
+		if( model != null ) {
+			IArchiveNode[] archives = model.getRoot(project).getAllChildren();
+			List<IArchiveNode> list = Arrays.asList(archives);
+			return (IArchive[]) list.toArray(new IArchive[list.size()]);
+		}
+		return null;
+	}
 }

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/dialogs/ArchiveNodeDestinationDialog.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/dialogs/ArchiveNodeDestinationDialog.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/dialogs/ArchiveNodeDestinationDialog.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -2,7 +2,6 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
@@ -12,6 +11,7 @@
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jface.viewers.ILabelProvider;
@@ -25,7 +25,9 @@
 import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
 import org.eclipse.ui.ide.IDE;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
+import org.jboss.ide.eclipse.archives.core.util.ModelUtil;
 import org.jboss.ide.eclipse.archives.ui.ArchivesUIMessages;
 import org.jboss.ide.eclipse.archives.ui.providers.ArchivesLabelProvider;
 
@@ -76,10 +78,9 @@
 					}
 				}
 				if (showNodes && parentElement instanceof IProject) {
-					result.addAll(Arrays.asList(ArchivesModel.instance()
-							.getProjectArchives(
-									((IProject) parentElement).getLocation(),
-									true, new NullProgressMonitor())));
+					IPath path = ((IProject)parentElement).getLocation();
+					IArchive[] archives = ModelUtil.getProjectArchives(path);
+					result.addAll(Arrays.asList(archives));
 				}
 				return result.toArray();
 			}
@@ -115,8 +116,8 @@
 				 IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
 				 for( int i = 0; i < projects.length; i++ ) {
 					 if( projects[i].isAccessible()) {
-						 List tmp = Arrays.asList(
-								 ArchivesModel.instance().getProjectArchives(projects[i].getLocation(), true, monitor));
+						 IArchive[] archives = ModelUtil.getProjectArchives(projects[i].getLocation());
+						 List tmp = Arrays.asList(archives);
 						 if( tmp.size() > 0 && !destinations.contains(projects[i]))
 							 destinations.add(projects[i]);
 					 }

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/providers/ArchivesContentProvider.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/providers/ArchivesContentProvider.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/providers/ArchivesContentProvider.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -7,6 +7,7 @@
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveModelNode;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
+import org.jboss.ide.eclipse.archives.core.util.ModelUtil;
 import org.jboss.ide.eclipse.archives.ui.PrefsInitializer;
 import org.jboss.ide.eclipse.archives.ui.views.ProjectArchivesView;
 
@@ -54,7 +55,7 @@
 			// return all that's there
 		}
 		if( parentElement instanceof WrappedProject ) {
-			return ArchivesModel.instance().getProjectArchives(((WrappedProject)parentElement).getProject().getLocation());
+			return ModelUtil.getProjectArchives(((WrappedProject)parentElement).getProject().getLocation());
 		}
 		if( parentElement instanceof IArchiveNode ) {
 			return ((IArchiveNode)parentElement).getAllChildren();

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/views/ArchivesMenuHandler.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/views/ArchivesMenuHandler.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/views/ArchivesMenuHandler.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -29,14 +29,17 @@
 import org.jboss.ide.eclipse.archives.core.build.ArchiveBuildDelegate;
 import org.jboss.ide.eclipse.archives.core.model.ArchiveNodeFactory;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFileSet;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFolder;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
+import org.jboss.ide.eclipse.archives.core.model.internal.xb.XMLBinding.XbException;
 import org.jboss.ide.eclipse.archives.ui.ArchivesSharedImages;
 import org.jboss.ide.eclipse.archives.ui.ArchivesUIMessages;
 import org.jboss.ide.eclipse.archives.ui.ExtensionManager;
 import org.jboss.ide.eclipse.archives.ui.NodeContribution;
+import org.jboss.ide.eclipse.archives.ui.PackagesUIPlugin;
 import org.jboss.ide.eclipse.archives.ui.actions.ActionWithDelegate;
 import org.jboss.ide.eclipse.archives.ui.actions.NewArchiveAction;
 import org.jboss.ide.eclipse.archives.ui.actions.NewJARAction;
@@ -299,23 +302,29 @@
 		
 		int response = dialog.open();
 		if (response == Dialog.OK) {
-			String[] folderPaths = dialog.getValue().split("[\\\\/]");
-			IArchiveNode selected = getSelectedNode();
-			IArchiveFolder current = null;
-			IArchiveFolder temp = null;
-			
-			for(int i = folderPaths.length-1; i >= 0 ; i-- ) {
-				temp = ArchiveNodeFactory.createFolder();
-				temp.setName(folderPaths[i]);
-				if( current == null ) 
-					current = temp;
-				else {
-					temp.addChild(current);
-					current = temp;
+			try {
+				String[] folderPaths = dialog.getValue().split("[\\\\/]");
+				IArchiveNode selected = getSelectedNode();
+				IArchiveFolder current = null;
+				IArchiveFolder temp = null;
+				
+				for(int i = folderPaths.length-1; i >= 0 ; i-- ) {
+					temp = ArchiveNodeFactory.createFolder();
+					temp.setName(folderPaths[i]);
+					if( current == null ) 
+						current = temp;
+					else {
+						temp.addChild(current);
+						current = temp;
+					}
 				}
+				
+				selected.addChild(current);
+				//ArchivesModel.
+			} catch( ArchivesModelException ame ) {
+				IStatus status = new Status(IStatus.ERROR, PackagesUIPlugin.PLUGIN_ID, "Error Attaching Archives Node", ame);
+				PackagesUIPlugin.getDefault().getLog().log(status);
 			}
-
-			ArchivesModel.instance().attach(selected, current, new NullProgressMonitor());
 		}
 	}
 	
@@ -353,7 +362,12 @@
 				int response = dialog.open();
 				if (response == Dialog.OK) {
 					folder.setName(dialog.getValue());
-					ArchivesModel.instance().saveModel(folder.getProjectPath(), new NullProgressMonitor());
+					try {
+						ArchivesModel.instance().save(folder.getProjectPath(), new NullProgressMonitor());
+					} catch( ArchivesModelException ame ) {
+						IStatus status = new Status(IStatus.ERROR, PackagesUIPlugin.PLUGIN_ID, "Problem saving archives model", ame);
+						PackagesUIPlugin.getDefault().getLog().log(status);
+					}
 				}
 			} 
 		}
@@ -378,7 +392,13 @@
 			IArchiveNode parent = (IArchiveNode) node.getParent();
 			parent.removeChild(node);
 			if( parent.getProjectPath() != null ) {
-				ArchivesModel.instance().saveModel(parent.getProjectPath(), new NullProgressMonitor());
+				try {
+					ArchivesModel.instance().save(parent.getProjectPath(), new NullProgressMonitor());
+				} catch( ArchivesModelException ame ) {
+					IStatus status = new Status(IStatus.ERROR, PackagesUIPlugin.PLUGIN_ID, "Problem saving archives model", ame);
+					PackagesUIPlugin.getDefault().getLog().log(status);
+				}
+
 			}
 		}
 	}

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/views/ProjectArchivesView.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/views/ProjectArchivesView.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/views/ProjectArchivesView.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -9,6 +9,8 @@
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
@@ -36,12 +38,14 @@
 import org.eclipse.ui.part.ViewPart;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModelCore;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveModelListener;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveModelNode;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNodeDelta;
 import org.jboss.ide.eclipse.archives.ui.ArchivesUIMessages;
 import org.jboss.ide.eclipse.archives.ui.ExtensionManager;
+import org.jboss.ide.eclipse.archives.ui.PackagesUIPlugin;
 import org.jboss.ide.eclipse.archives.ui.PrefsInitializer;
 import org.jboss.ide.eclipse.archives.ui.actions.NewArchiveAction;
 import org.jboss.ide.eclipse.archives.ui.providers.ArchivesContentProvider;
@@ -263,7 +267,12 @@
 		getSite().getShell().getDisplay().asyncExec(new Runnable () {
 			public void run () {
 				for( int i = 0; i < projects.length; i++ ) {
-					ArchivesModel.instance().registerProject(projects[i].getLocation(), loadingProgress);
+					try {
+						ArchivesModel.instance().registerProject(projects[i].getLocation(), loadingProgress);
+					} catch( ArchivesModelException ame ) {
+						IStatus status = new Status(IStatus.ERROR, PackagesUIPlugin.PLUGIN_ID, ame.getMessage(), ame);
+						PackagesUIPlugin.getDefault().getLog().log(status);
+					}
 				}
 				book.showPage(viewerComposite);
 				packageViewer.setInput(ArchivesModel.instance().getRoot(projectToShow.getLocation()));

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/AbstractArchiveWizard.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/AbstractArchiveWizard.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/AbstractArchiveWizard.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -7,6 +7,8 @@
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -15,8 +17,10 @@
 import org.eclipse.ui.INewWizard;
 import org.eclipse.ui.IWorkbench;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
+import org.jboss.ide.eclipse.archives.ui.PackagesUIPlugin;
 import org.jboss.ide.eclipse.archives.ui.views.ProjectArchivesView;
 import org.jboss.ide.eclipse.archives.ui.wizards.pages.ArchiveInfoWizardPage;
 
@@ -82,28 +86,33 @@
 					public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
 						IArchiveNode parent = null;
 						
-						if (destination instanceof IArchiveNode) {
-							// if we're modifying an existing package, remove old parentage
-							if (!create && !destination.equals(pkg.getParent())) {
-								if (pkg.getParent() != null) {
-									pkg.getParent().removeChild(pkg);
+						try {
+							if (destination instanceof IArchiveNode) {
+								// if we're modifying an existing package, remove old parentage
+								if (!create && !destination.equals(pkg.getParent())) {
+									if (pkg.getParent() != null) {
+										pkg.getParent().removeChild(pkg);
+									}
 								}
+								parent = (IArchiveNode)destination;
+							} else {
+								parent = ArchivesModel.instance().getRoot(project.getLocation());
+								if( parent == null ) 
+									parent = ArchivesModel.instance().registerProject(project.getLocation(), null);
 							}
-							parent = (IArchiveNode)destination;
-						} else {
-							parent = ArchivesModel.instance().getRoot(project.getLocation(), true, monitor);
+						
+							if( create ) 
+								parent.addChild(pkg);
+							ArchivesModel.instance().save(project.getLocation(), monitor);
+						} catch( ArchivesModelException ame ) {
+							IStatus status = new Status(IStatus.ERROR, PackagesUIPlugin.PLUGIN_ID, "Error Completing Wizard", ame);
+							PackagesUIPlugin.getDefault().getLog().log(status);
 						}
-						
-						if( create ) 
-							ArchivesModel.instance().attach(parent, pkg, monitor);
-						else
-							ArchivesModel.instance().saveModel(project.getLocation(), monitor);
+
 					}
 				});
 			} catch (InvocationTargetException e) {
-//TODO				Trace.trace(getClass(), e);
 			} catch (InterruptedException e) {
-//TODO				Trace.trace(getClass(), e);
 			}
 		}
 		return performed;

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/FilesetWizard.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/FilesetWizard.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/FilesetWizard.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -3,13 +3,17 @@
 import java.lang.reflect.InvocationTargetException;
 
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.wizard.Wizard;
 import org.jboss.ide.eclipse.archives.core.model.ArchiveNodeFactory;
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFileSet;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
+import org.jboss.ide.eclipse.archives.ui.PackagesUIPlugin;
 import org.jboss.ide.eclipse.archives.ui.wizards.pages.FilesetInfoWizardPage;
 
 public class FilesetWizard extends Wizard {
@@ -26,7 +30,6 @@
 	}
 	
 	public boolean performFinish() {
-		try {
 		final boolean createFileset = this.fileset == null;
 		
 		if (createFileset)
@@ -36,19 +39,18 @@
 		try {
 			getContainer().run(false, false, new IRunnableWithProgress () {
 				public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-					if (createFileset) {
-						ArchivesModel.instance().attach(parentNode, fileset, monitor);
-					} else {
-						ArchivesModel.instance().saveModel(fileset.getProjectPath(), monitor);
+					try {
+						if (createFileset) 
+							parentNode.addChild(fileset);
+						ArchivesModel.instance().save(fileset.getProjectPath(), monitor);
+					}  catch( ArchivesModelException ame ) {
+						IStatus status = new Status(IStatus.ERROR, PackagesUIPlugin.PLUGIN_ID, "Error Completing Wizard", ame);
+						PackagesUIPlugin.getDefault().getLog().log(status);
 					}
 				}
 			});
 		} catch (InvocationTargetException e) {
-//TODO			Trace.trace(getClass(), e);
 		} catch (InterruptedException e) {
-//TODO			Trace.trace(getClass(), e);
-		}
-		
 		} catch(Exception e) {e.printStackTrace();}
 		return true;
 	}

Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/pages/ArchiveInfoWizardPage.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/pages/ArchiveInfoWizardPage.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/src/main/org/jboss/ide/eclipse/archives/ui/wizards/pages/ArchiveInfoWizardPage.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -20,6 +20,7 @@
 import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
+import org.jboss.ide.eclipse.archives.core.util.ModelUtil;
 import org.jboss.ide.eclipse.archives.ui.ArchivesSharedImages;
 import org.jboss.ide.eclipse.archives.ui.ArchivesUIMessages;
 import org.jboss.ide.eclipse.archives.ui.util.DestinationChangeListener;
@@ -193,7 +194,7 @@
 			}
 		} else if (destination instanceof IContainer) {
 			IContainer container = (IContainer) destination;
-			IArchive[] packages = ArchivesModel.instance().getProjectArchives(wizard.getProject().getLocation());
+			IArchive[] packages = ModelUtil.getProjectArchives(wizard.getProject().getLocation());
 			if (packages != null) {
 				for( int i = 0; i < packages.length; i++ ) {
 					IArchive pkg = (IArchive) packages[i];
@@ -211,7 +212,7 @@
 			}
 		} else if (destination instanceof IPath) {
 			IPath path = (IPath) destination;
-			IArchive[] packages = ArchivesModel.instance().getProjectArchives(wizard.getProject().getLocation());
+			IArchive[] packages = ModelUtil.getProjectArchives(wizard.getProject().getLocation());
 			if (packages != null) {
 				for( int i = 0; i < packages.length; i++ ) {
 					IArchive pkg = (IArchive) packages[i];

Modified: trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/ModelUtilTest.java
===================================================================
--- trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/ModelUtilTest.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/ModelUtilTest.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -9,6 +9,7 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.jboss.ide.eclipse.archives.core.model.ArchiveNodeFactory;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchive;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFileSet;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveFolder;
@@ -33,7 +34,11 @@
 				inputs = bundlePath.append("inputs");
 			} catch( IOException ioe) {}
 		}
-		rootArchive = createArchive();
+		try {
+			rootArchive = createArchive();
+		} catch( ArchivesModelException ame ) {
+			fail(ame.getMessage());
+		}
 	}
 
 	public void tearDown() {
@@ -42,7 +47,7 @@
 	
 	
 	
-	protected IArchive createArchive() {
+	protected IArchive createArchive() throws ArchivesModelException {
 		IPath fileTrees = inputs.append("fileTrees");
 
 		IArchive root = ArchiveNodeFactory.createArchive();
@@ -77,7 +82,7 @@
 		imageFileset.setIncludesPattern("**/*.gif,**/*.png,**/*.xml");
 		images.addChild(imageFileset);
 		
-		((ArchiveNodeImpl)root).clearDeltas();
+		((ArchiveNodeImpl)root).clearDelta();
 		return root;
 	}
 	
@@ -117,7 +122,7 @@
 		
 	}
 	
-	public void testOtherFilesetMatchesPath() {
+	public void testOtherFilesetMatchesPath() throws ArchivesModelException {
 		IPath xml = inputs.append("fileTrees").append("misc").append("rug.xml");
 		IArchiveFileSet[] xmlFS = ModelUtil.getMatchingFilesets(rootArchive, xml);
 		assertTrue(xmlFS.length == 2);

Modified: trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/ModelCreationTest.java
===================================================================
--- trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/ModelCreationTest.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/ModelCreationTest.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -24,10 +24,17 @@
 import junit.framework.TestCase;
 
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
+import org.jboss.ide.eclipse.archives.core.model.ArchiveNodeFactory;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModel;
+import org.jboss.ide.eclipse.archives.core.model.ArchivesModelException;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveBuildListener;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveFolder;
 import org.jboss.ide.eclipse.archives.core.model.IArchiveModelListener;
-import org.jboss.ide.eclipse.archives.core.model.IArchiveModelListenerManager;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveModel;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveNode;
+import org.jboss.ide.eclipse.archives.core.model.IArchiveNodeDelta;
 import org.jboss.ide.eclipse.archives.core.model.internal.ArchiveModelNode;
 import org.jboss.ide.eclipse.archives.core.model.internal.xb.XbPackage;
 import org.jboss.ide.eclipse.archives.core.model.internal.xb.XbPackages;
@@ -38,34 +45,78 @@
  *
  */
 public class ModelCreationTest extends TestCase {
-	public void testModelCreation1() {
-		XbPackages packs = new XbPackages();
-		XbPackage pack = new XbPackage();
-		packs.addChild(pack);
-		ArchiveModelNode model = getModel(packs);
-		ModelUtil.fillArchiveModel(packs, model);
-		// passes for now. 
+	protected IPath project = new Path("test").append("project");
+	TempArchiveModelListener modelListener = createListener();
+	protected void setUp() throws Exception {
+		modelListener.clearDelta();
 	}
+
+	public void testSimpleCreation() {
+		createModel();
+	}
 	
+	public void testAddToModel() {
+		ArchiveModelNode model = createModel();
+		ArchivesModel.instance().registerProject(model, new NullProgressMonitor());
+		assertEquals(model, ArchivesModel.instance().getRoot(project));
+		assertNotSame(null, modelListener.getDelta());
+		assertEquals(IArchiveNodeDelta.NODE_REGISTERED, modelListener.getDelta().getKind());
+		ArchivesModel.instance().unregisterProject(model, new NullProgressMonitor());
+	}
+	
+	protected ArchiveModelNode createModel() {
+		try {
+			XbPackages packs = new XbPackages();
+			XbPackage pack = new XbPackage();
+			packs.addChild(pack);
+			ArchiveModelNode model = getModel(packs);
+			ModelUtil.fillArchiveModel(packs, model);
+			assertEquals(project, model.getProjectPath());
+			assertEquals(IArchiveNode.TYPE_MODEL, model.getNodeType());
+			assertEquals(null, model.getParent());
+			assertEquals(packs, model.getNodeDelegate());
+			assertTrue(model.hasChildren());
+			assertEquals(1, model.getAllChildren().length);
+			assertEquals(null, ArchivesModel.instance().getRoot(project));
+			assertEquals(null, modelListener.getDelta());
+			return model;
+		} catch( ArchivesModelException ame ) {
+			fail(ame.getMessage());
+		}
+		return null;
+	}
+	
+	public void testDeltas() {
+		try {
+			ArchiveModelNode model = createModel();
+			model.clearDelta();
+			IArchiveFolder folder = ArchiveNodeFactory.createFolder();
+			folder.setName("testFolder");
+			model.addChild(folder);
+			IArchiveNodeDelta delta = model.getDelta();
+			assertEquals(IArchiveNodeDelta.CHILD_ADDED, delta.getKind());
+		} catch( ArchivesModelException ame ) {
+			fail(ame.getMessage());
+		}
+	}
+	
 	protected ArchiveModelNode getModel(XbPackages packs) {
-		IArchiveModelListenerManager manager = new IArchiveModelListenerManager() {
-			public void addBuildListener(IArchiveBuildListener listener) {
-			}
-			public void addModelListener(IArchiveModelListener listener) {
-			}
-			public IArchiveBuildListener[] getBuildListeners() {
-				return new IArchiveBuildListener[] {};
-			}
-			public IArchiveModelListener[] getModelListeners() {
-				return new IArchiveModelListener[] {};
-			}
-			public void removeBuildListener(IArchiveBuildListener listener) {
-			}
-			public void removeModelListener(IArchiveModelListener listener) {
-			}
-		};
-		IPath project = new Path("test").append("two");
-		ArchiveModelNode node = new ArchiveModelNode(project, packs, manager);
+		IArchiveModel model = new ArchivesModel();
+		model.addModelListener(modelListener);
+		ArchiveModelNode node = new ArchiveModelNode(project, packs, model);
 		return node;
 	}
+	
+	protected TempArchiveModelListener createListener() {
+		return new TempArchiveModelListener();
+	}
+	
+	protected class TempArchiveModelListener implements IArchiveModelListener {
+		private IArchiveNodeDelta delta;
+		public void modelChanged(IArchiveNodeDelta delta) {
+			this.delta = delta;
+		} 
+		public IArchiveNodeDelta getDelta() { return delta; }
+		public void clearDelta() { delta = null; }
+	}
 }

Modified: trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/XBMarshallTest.java
===================================================================
--- trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/XBMarshallTest.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/XBMarshallTest.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -103,8 +103,6 @@
 		} catch( XbException xbe ) {
 			xbe.printStackTrace();
 			fail(xbe.getMessage());
-		} catch( IOException ioe ) {
-			fail(ioe.getMessage());
 		}
 	}
 	
@@ -113,9 +111,7 @@
 		try {
 			IPath out = outputs.append("test.xml");
 			XMLBinding.marshallToFile(packs, out, new NullProgressMonitor());
-		} catch( IOException ioe ) {
-			fail("IOException during testWritePackage operation");
-		}catch( XbException xbe ) {
+		} catch( XbException xbe ) {
 			e = xbe;
 		} finally {
 			if( e == null && !shouldPass) {
@@ -128,7 +124,6 @@
 	}
 	
 	protected void writePackage(String name, String toDir, boolean shouldPass) {
-		XbException e = null;
 		XbPackages packs = new XbPackages();
 		XbPackage pack = new XbPackage();
 		pack.setName(name);

Modified: trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/XBUnmarshallTest.java
===================================================================
--- trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/XBUnmarshallTest.java	2008-03-11 19:38:40 UTC (rev 6877)
+++ trunk/core/tests/org.jboss.ide.eclipse.archives.test/src/org/jboss/ide/eclipse/archives/test/model/XBUnmarshallTest.java	2008-03-11 19:41:22 UTC (rev 6878)
@@ -196,13 +196,9 @@
 	 */
 	
 	protected XbPackages parse(String file, boolean shouldSucceed, String failMsg) {
-		FileInputStream fis = null;
 		XbPackages packs = null;
 		try {
-			fis = new FileInputStream(archiveDescriptors.append(file).toFile());
-			packs = XMLBinding.unmarshal(fis, new NullProgressMonitor());
-		} catch( IOException ioe ) {
-			fail(ioe.getMessage());
+			packs = XMLBinding.unmarshal(archiveDescriptors.append(file).toFile(), new NullProgressMonitor());
 		} catch( XbException e ) {
 			if( shouldSucceed )
 				fail(failMsg + " - " + e.getMessage());




More information about the jbosstools-commits mailing list