[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