[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:50:44 EDT 2007


  User: rawb    
  Date: 07/04/16 13:50:44

  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.3       +0 -0      jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/build/PackagesNature.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: PackagesNature.java
  ===================================================================
  RCS file: PackagesNature.java
  diff -N PackagesNature.java
  --- /dev/null	1 Jan 1970 00:00:00 -0000
  +++ PackagesNature.java	16 Apr 2007 17:50:44 -0000	1.3
  @@ -0,0 +1,113 @@
  +/*
  + * 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.3       +0 -0      jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/build/PackagesBuilder.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: PackagesBuilder.java
  ===================================================================
  RCS file: PackagesBuilder.java
  diff -N PackagesBuilder.java
  --- /dev/null	1 Jan 1970 00:00:00 -0000
  +++ PackagesBuilder.java	16 Apr 2007 17:50:44 -0000	1.3
  @@ -0,0 +1,148 @@
  +/*
  + * 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;
  +			}
  +		});		
  +	}
  +	
  +}
  \ No newline at end of file
  
  
  
  1.3       +0 -0      jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/build/PackageBuildDelegate.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: PackageBuildDelegate.java
  ===================================================================
  RCS file: PackageBuildDelegate.java
  diff -N PackageBuildDelegate.java
  --- /dev/null	1 Jan 1970 00:00:00 -0000
  +++ PackageBuildDelegate.java	16 Apr 2007 17:50:44 -0000	1.3
  @@ -0,0 +1,76 @@
  +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.3       +0 -0      jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/build/ModelChangeListener.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: ModelChangeListener.java
  ===================================================================
  RCS file: ModelChangeListener.java
  diff -N ModelChangeListener.java
  --- /dev/null	1 Jan 1970 00:00:00 -0000
  +++ ModelChangeListener.java	16 Apr 2007 17:50:44 -0000	1.3
  @@ -0,0 +1,130 @@
  +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