[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