[jboss-cvs] jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/build ...

Robert Stryker rob.stryker at jboss.com
Mon Apr 16 13:34:43 EDT 2007


  User: rawb    
  Date: 07/04/16 13:34:43

  Added:       core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/build    
                        PackagesNature.java PackagesBuilder.java
                        PackageBuildDelegate.java ModelChangeListener.java
  Log:
  Complete rewrite of the the two plugins leading to a cleaner, leaner project. 
  
  Revision  Changes    Path
  1.1      date: 2007/04/16 17:34:42;  author: rawb;  state: Exp;jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/build/PackagesNature.java
  
  Index: PackagesNature.java
  ===================================================================
  /*
   * 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.packages.core.build;
  
  import java.util.ArrayList;
  
  import org.eclipse.core.resources.ICommand;
  import org.eclipse.core.resources.IProject;
  import org.eclipse.core.resources.IProjectDescription;
  import org.eclipse.core.resources.IProjectNature;
  import org.eclipse.core.runtime.CoreException;
  import org.eclipse.core.runtime.NullProgressMonitor;
  
  public class PackagesNature implements IProjectNature {
  
  	public static final String NATURE_ID = "org.jboss.ide.eclipse.packages.core.packagesNature";
  	
  	private IProject project;
  	
  	public void configure() throws CoreException {
  		addProjectBuilder(project, PackagesBuilder.BUILDER_ID);
  	}
  
  	public void deconfigure() throws CoreException {
  		removeProjectBuilder(project, PackagesBuilder.BUILDER_ID);
  	}
  
  	public IProject getProject() {
  		return project;
  	}
  
  	public void setProject(IProject project) {
  		this.project = project;
  	}
  	
  	   public static boolean addProjectBuilder(IProject project, String builderId)
  	   {
  	      try
  	      {
  	         IProjectDescription desc = project.getDescription();
  	         ICommand[] commands = desc.getBuildSpec();
  
  	         //add builders to project
  	         ICommand builderCommand = desc.newCommand();
  	         builderCommand.setBuilderName(builderId);
  
  	         ICommand[] newCommands = new ICommand[commands.length + 1];
  	         System.arraycopy(commands, 0, newCommands, 0, commands.length);
  	         newCommands[newCommands.length - 1] = builderCommand;
  
  	         desc.setBuildSpec(newCommands);
  
  	         project.setDescription(desc, new NullProgressMonitor());
  	      }
  	      catch (CoreException e)
  	      {
  	         e.printStackTrace();
  	         return false;
  	      }
  
  	      return true;
  	   }
  
  	   /**
  	    * Removes a specific builder from the end of a given project's builder list.
  	    * @param project
  	    * @param builderId
  	    * @return Whether or not the builder was successfully removed
  	    */
  	   public static boolean removeProjectBuilder(IProject project, String builderId) {
  	      try {
  	         IProjectDescription desc = project.getDescription();
  	         ICommand[] commands = desc.getBuildSpec();
  	         ArrayList newCommands = new ArrayList();
  
  	         for (int i = 0; i < commands.length; i++) {
  	            if (!commands[i].getBuilderName().equals(builderId)) {
  	               newCommands.add(commands[i]);
  	            }
  	         }
  
  	         desc.setBuildSpec((ICommand[]) newCommands.toArray(new ICommand[newCommands.size()]));
  
  	         project.setDescription(desc, new NullProgressMonitor());
  	      } catch (CoreException e) {
  	         e.printStackTrace();
  	         return false;
  	      }
  
  	      return true;
  	   }
  
  
  }
  
  
  
  1.1      date: 2007/04/16 17:34:42;  author: rawb;  state: Exp;jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/build/PackagesBuilder.java
  
  Index: PackagesBuilder.java
  ===================================================================
  /*
   * 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.packages.core.build;
  
  import java.util.Comparator;
  import java.util.Map;
  import java.util.TreeSet;
  
  import org.eclipse.core.resources.IProject;
  import org.eclipse.core.resources.IResource;
  import org.eclipse.core.resources.IResourceDelta;
  import org.eclipse.core.resources.IResourceDeltaVisitor;
  import org.eclipse.core.resources.IWorkspaceRoot;
  import org.eclipse.core.resources.IncrementalProjectBuilder;
  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.jboss.ide.eclipse.packages.core.model.IPackage;
  import org.jboss.ide.eclipse.packages.core.model.IPackageFileSet;
  import org.jboss.ide.eclipse.packages.core.model.IPackageNode;
  import org.jboss.ide.eclipse.packages.core.model.IPackageNodeVisitor;
  import org.jboss.ide.eclipse.packages.core.model.events.EventManager;
  import org.jboss.ide.eclipse.packages.core.model.internal.PackageModelNode;
  import org.jboss.ide.eclipse.packages.core.model.internal.PackagesModel;
  import org.jboss.ide.eclipse.packages.core.util.TrueZipUtil;
  
  /**
   * The builder is responsible for building packages.
   * 
   * @author Stryker
   */
  public class PackagesBuilder extends IncrementalProjectBuilder {
  
  	public static final String BUILDER_ID = "org.jboss.ide.eclipse.packages.core.packagesBuilder";
  	
  	protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
  		EventManager.fireBuildStarted();
  		IProject[] interestingProjects = getInterestingProjectsInternal();
  
  		final TreeSet addedChanged = createDefaultTreeSet();
  		final TreeSet removed = createDefaultTreeSet();
  
  		PackageBuildDelegate delegate = new PackageBuildDelegate();
  		if (kind == IncrementalProjectBuilder.INCREMENTAL_BUILD || kind == IncrementalProjectBuilder.AUTO_BUILD) {
  			fillDeltas(interestingProjects, addedChanged, removed);
  			delegate.projectIncrementalBuild(addedChanged, removed);
  			
  		} else if (kind == IncrementalProjectBuilder.FULL_BUILD){
  			// build each package fully
  			IProject p = getProject();
  			delegate.fullProjectBuild(p);
  		}
  		
  		
  		EventManager.fireBuildEnded();
  		return interestingProjects;
  	}
  	
  	protected void clean(IProgressMonitor monitor) throws CoreException {
  		IProject p = getProject();
  		PackageModelNode root = PackagesModel.instance().getRoot(p);
  		IPackageNode[] nodes = root.getChildren(IPackageNode.TYPE_PACKAGE);
  		for( int i = 0; i < nodes.length; i++ ) {
  			IPath path = ((IPackage)nodes[i]).getDestinationPath();
  			TrueZipUtil.deleteAll(path);
  		}
  	}
  
  	protected void fillDeltas(IProject[] projects, final TreeSet addedChanged, final TreeSet removed) {
  		for( int i = 0; i < projects.length; i++ ) {
  			final IProject proj = projects[i];
  			IResourceDelta delta = getDelta(proj);
  			try {
  				delta.accept(new IResourceDeltaVisitor () { 
  					public boolean visit(IResourceDelta delta) throws CoreException {
  						if (delta.getResource().getType() == IResource.FILE)  {
  							if( (delta.getKind() & IResourceDelta.ADDED) > 0  
  									|| (delta.getKind() & IResourceDelta.CHANGED) > 0) {
  								
  								// 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(PackagesModel.PROJECT_PACKAGES_FILE))) 
  									addedChanged.add(delta.getResource());
  							} else if( (delta.getKind() & IResourceDelta.REMOVED ) > 0 ) {
  								removed.add(delta.getResource());
  							}
  						} 
  						return true;
  					}
  				});
  			} catch( CoreException ce) {
  				
  			}
  		}
  	}
  	protected IProject[] getInterestingProjectsInternal() {
  		final TreeSet set = createDefaultTreeSet();
  		set.add(getProject());
  		
  		final IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
  		final int count = workspaceRoot.getLocation().segmentCount();
  
  		PackagesModel.instance().getRoot(getProject()).accept(new IPackageNodeVisitor () {
  			public boolean visit (IPackageNode node) {
  				if (node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET) {
  					IPackageFileSet fileset = (IPackageFileSet)node;
  					IPath p = fileset.getSourcePath();
  					if( workspaceRoot.getLocation().isPrefixOf(p)) {
  						IProject proj = workspaceRoot.getProject(p.segment(count));
  						set.add(proj);
  					}
  				}
  				return true;
  			}
  		});
  		return (IProject[]) set.toArray(new IProject[set.size()]);
  	}
  	
  	protected TreeSet createDefaultTreeSet() {
  		return new TreeSet(new Comparator () {
  			public int compare(Object o1, Object o2) {
  				if (o1.equals(o2)) return 0;
  				else return -1;
  			}
  		});		
  	}
  	
  }
  
  
  1.1      date: 2007/04/16 17:34:42;  author: rawb;  state: Exp;jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/build/PackageBuildDelegate.java
  
  Index: PackageBuildDelegate.java
  ===================================================================
  package org.jboss.ide.eclipse.packages.core.build;
  
  import java.util.Iterator;
  import java.util.Set;
  
  import org.eclipse.core.resources.IProject;
  import org.eclipse.core.resources.IResource;
  import org.eclipse.core.runtime.IPath;
  import org.jboss.ide.eclipse.packages.core.model.IPackage;
  import org.jboss.ide.eclipse.packages.core.model.IPackageFileSet;
  import org.jboss.ide.eclipse.packages.core.model.IPackageNode;
  import org.jboss.ide.eclipse.packages.core.model.internal.PackageModelNode;
  import org.jboss.ide.eclipse.packages.core.model.internal.PackagesModel;
  import org.jboss.ide.eclipse.packages.core.util.ModelTruezipBridge;
  import org.jboss.ide.eclipse.packages.core.util.ModelUtil;
  
  public class PackageBuildDelegate {
  	
  	// TODO:  Create lock mechanism which will interlock with model changes
  	public PackageBuildDelegate() {
  		
  	}
  	
  	
  	// full build
  	public void fullProjectBuild(IProject project) {
  		PackageModelNode root = PackagesModel.instance().getRoot(project);
  		IPackageNode[] nodes = root.getChildren(IPackageNode.TYPE_PACKAGE);
  		for( int i = 0; i < nodes.length; i++ ) {
  			fullPackageBuild(((IPackage)nodes[i]));
  		}
  	}
  	
  	public void fullPackageBuild(IPackage pkg) {
  		ModelTruezipBridge.deletePackage(pkg);
  		IPackageFileSet[] filesets = ModelUtil.findAllDescendentFilesets(pkg);
  		for( int i = 0; i < filesets.length; i++ ) {
  			fullFilesetBuild(filesets[i]);
  		}
  	}
  	
  	public void fullFilesetBuild(IPackageFileSet fileset) {
  		fileset.resetScanner();
  		IPath[] paths = fileset.findMatchingPaths();
  		ModelTruezipBridge.copyFiles(fileset, paths);
  	}
  
  	
  	
  	
  	/**
  	 * Incremental Build!! 
  	 * @param addedChanged  Set of changed / added resources
  	 * @param setRemoved	Set of removed resources
  	 */
  	public void projectIncrementalBuild(Set addedChanged, Set removed) {
  		
  		
  		// find any and all filesets that match each file
  		Iterator i = addedChanged.iterator();
  		IPath path;
  		IPackageFileSet[] matchingFilesets;
  		while(i.hasNext()) {
  			path = ((IResource)i.next()).getLocation();
  			matchingFilesets = ModelUtil.getMatchingFilesets(path);
  			ModelTruezipBridge.copyFiles(matchingFilesets, new IPath[] { path });
  		}
  		
  		i = removed.iterator();
  		while(i.hasNext()) {
  			path = ((IResource)i.next()).getLocation();
  			matchingFilesets = ModelUtil.getMatchingFilesets(path);
  			ModelTruezipBridge.deleteFiles(matchingFilesets, new IPath[] { path });
  		}
  	}
  }
  
  
  
  1.1      date: 2007/04/16 17:34:42;  author: rawb;  state: Exp;jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/build/ModelChangeListener.java
  
  Index: ModelChangeListener.java
  ===================================================================
  package org.jboss.ide.eclipse.packages.core.build;
  
  import org.jboss.ide.eclipse.packages.core.model.IPackage;
  import org.jboss.ide.eclipse.packages.core.model.IPackageFileSet;
  import org.jboss.ide.eclipse.packages.core.model.IPackageFolder;
  import org.jboss.ide.eclipse.packages.core.model.IPackageNode;
  import org.jboss.ide.eclipse.packages.core.model.IPackagesModelDelta;
  import org.jboss.ide.eclipse.packages.core.model.IPackagesModelListener;
  import org.jboss.ide.eclipse.packages.core.util.ModelTruezipBridge;
  import org.jboss.ide.eclipse.packages.core.util.ModelUtil;
  
  public class ModelChangeListener implements IPackagesModelListener {
  
  	/**
  	 * This is the entry point for model change events.
  	 * It immediately passes the delta to be handled.
  	 */
  	public void modelChanged(IPackagesModelDelta delta) {
  		handle(delta);
  	}
  
  	/**
  	 * This can handle any type of node / delta, not just
  	 * root elements. If the node is added or removed, it 
  	 * will handle those segments and return without checking
  	 * the children at all. IT is the responsibility of the add
  	 * and remove methods to go through the children.
  	 * 
  	 *  Otherwise, it will simply handle attribute children and then
  	 *  move on to the children.
  	 * 
  	 * @param delta
  	 */
  	private void handle(IPackagesModelDelta delta) {
  		if( (delta.getKind() & IPackagesModelDelta.REMOVED) != 0 ) {
  			nodeRemoved(delta.getPreNode());
  			return;
  		} else if( (delta.getKind() & IPackagesModelDelta.ADDED) != 0 ) {
  			nodeAdded(delta.getPostNode());
  			return;
  		} else  if( (delta.getKind() & IPackagesModelDelta.ATTRIBUTE_CHANGED) != 0) {
  			boolean shouldHandleChildren = handleAttributeChange(delta);
  			if( shouldHandleChildren ) {
  				IPackagesModelDelta[] children = delta.getAffectedChildren();
  				for( int i = 0; i < children.length; i++ ) {
  					handle(children[i]);
  				}
  			}
  		} else if( descendentChanged(delta.getKind()) ) { 
  			IPackagesModelDelta[] children = delta.getAffectedChildren();
  			for( int i = 0; i < children.length; i++ ) {
  				handle(children[i]);
  			}
  		}
  	}
  	protected boolean descendentChanged(int kind) {
  		 return (kind & IPackagesModelDelta.DESCENDENT_CHANGED) != 0 || 
  		 		(kind & IPackagesModelDelta.CHILD_ADDED) != 0 ||
  		 		(kind & IPackagesModelDelta.CHILD_REMOVED) != 0;
  	}
  
  	/**
  	 * Handle changes in this node
  	 * @param delta
  	 * @return Whether or not the caller should also handle the children
  	 */
  	private boolean handleAttributeChange(IPackagesModelDelta delta) {
  		switch( delta.getPostNode().getNodeType()) {
  		case IPackageNode.TYPE_PACKAGE_FOLDER: 
  			return handleFolderAttributeChanged(delta);
  		case IPackageNode.TYPE_PACKAGE_FILESET:
  			return handleFilesetAttributeChanged(delta);
  		case IPackageNode.TYPE_PACKAGE:
  			return handlePackageAttributeChanged(delta);
  		}
  		return false;
  	}
  
  	private boolean handleFolderAttributeChanged(IPackagesModelDelta delta) {
  		nodeRemoved(delta.getPreNode());
  		nodeAdded(delta.getPostNode());
  		return false;
  	}
  	
  	private boolean handleFilesetAttributeChanged(IPackagesModelDelta delta) {
  		nodeRemoved(delta.getPreNode());
  		nodeAdded(delta.getPostNode());
  		return false;
  	}
  	
  	private boolean handlePackageAttributeChanged(IPackagesModelDelta delta) {
  		nodeRemoved(delta.getPreNode());
  		nodeAdded(delta.getPostNode());
  		return false;
  	}
  	
  	
  	
  	
  	private void nodeAdded(IPackageNode added) {
  		if( added.getNodeType() == IPackageNode.TYPE_PACKAGE) {
  			// create the package
  			ModelTruezipBridge.createContainer(added);
  		} else if( added.getNodeType() == IPackageNode.TYPE_PACKAGE_FOLDER ) {
  			// create hte folder
  			ModelTruezipBridge.createContainer(added);
  		}
  		IPackageFileSet[] filesets = ModelUtil.findAllDescendentFilesets(added);
  		for( int i = 0; i < filesets.length; i++ ) {
  			ModelTruezipBridge.fullFilesetBuild(filesets[i]);
  		}
  
  	}
  	
  	
  	private void nodeRemoved(IPackageNode removed) {
  		if( removed.getNodeType() == IPackageNode.TYPE_PACKAGE) {
  			ModelTruezipBridge.deletePackage((IPackage)removed);
  			return;
  		} else if( removed.getNodeType() == IPackageNode.TYPE_PACKAGE_FOLDER ){
  			ModelTruezipBridge.deleteFolder((IPackageFolder)removed);
  			return;
  		}
  
  		IPackageFileSet[] filesets = ModelUtil.findAllDescendentFilesets(removed);
  		for( int i = 0; i < filesets.length; i++ ) {
  			ModelTruezipBridge.fullFilesetRemove(filesets[i]);
  		}
  	}
  }
  
  
  



More information about the jboss-cvs-commits mailing list