You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by hi...@apache.org on 2009/09/21 16:39:58 UTC
svn commit: r817270 - in /ant/ivy/ivyde/trunk: ./ doc/
org.apache.ivyde.eclipse/ org.apache.ivyde.eclipse/icons/
org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/
org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepex...
Author: hibou
Date: Mon Sep 21 14:39:57 2009
New Revision: 817270
URL: http://svn.apache.org/viewvc?rev=817270&view=rev
Log:
IVYDE-195 : add the new view about exploring the dependencies the reversed way (thanks to Jon Schneider)
Added:
ant/ivy/ivyde/trunk/doc/revdepexplorer.html (with props)
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/icons/synced.gif (with props)
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java (with props)
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java (with props)
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/IvyUtil.java (with props)
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/MultiRevisionDependencyDescriptor.java (with props)
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java (with props)
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ProjectViewReverseDependenciesAction.java (with props)
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/views/ReverseDependencyExplorerView.java (with props)
Modified:
ant/ivy/ivyde/trunk/CHANGES.txt
ant/ivy/ivyde/trunk/doc/toc.json
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/plugin.xml
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathUtil.java
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/IvyDEProjectAction.java
ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/IvyDEProjectMenuAction.java
Modified: ant/ivy/ivyde/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/CHANGES.txt?rev=817270&r1=817269&r2=817270&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/CHANGES.txt (original)
+++ ant/ivy/ivyde/trunk/CHANGES.txt Mon Sep 21 14:39:57 2009
@@ -8,6 +8,7 @@
- NEW: Add option to not launch a resolve after saving a file with the IvyEditor (IVYDE-197) (thanks to Jon Schneider)
- NEW: File resource listener on Ivy files launches resolve when it detects modifications (IVYDE-199) (thanks to Jon Schneider)
- NEW: Add an option in the container to automatically laucnh a resolve before each launch (IVYDE-204)
+- NEW: "Reverse Dependency Explorer" View for synchronizing revisions across multiple projects in a workspace (IVYDE-195) (thanks to Jon Schneider)
- FIX: "Ivy Settings Path" Browse button results in an incorrectly formatted URL (IVYDE-191) (thanks to Jon Schneider)
- FIX: Workspace Resolver Prevents Source Download (IVYDE-188) (thanks to Phillip Webb)
Added: ant/ivy/ivyde/trunk/doc/revdepexplorer.html
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/doc/revdepexplorer.html?rev=817270&view=auto
==============================================================================
--- ant/ivy/ivyde/trunk/doc/revdepexplorer.html (added)
+++ ant/ivy/ivyde/trunk/doc/revdepexplorer.html Mon Sep 21 14:39:57 2009
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<html>
+<head>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
+ <script type="text/javascript">var xookiConfig = {level: 0};</script>
+ <script type="text/javascript" src="xooki/xooki.js"></script>
+</head>
+<body>
+ <textarea id="xooki-source">
+The reverse dependency explorer turns the dependency tree upside-down, exploring the workspace by organization, module, and revision and providing a mechanism to synchronize revisions across projects/classpath containers.</textarea>
+<script type="text/javascript">xooki.postProcess();</script>
+</body>
+</html>
Propchange: ant/ivy/ivyde/trunk/doc/revdepexplorer.html
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ant/ivy/ivyde/trunk/doc/revdepexplorer.html
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: ant/ivy/ivyde/trunk/doc/revdepexplorer.html
------------------------------------------------------------------------------
svn:mime-type = text/html
Modified: ant/ivy/ivyde/trunk/doc/toc.json
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/doc/toc.json?rev=817270&r1=817269&r2=817270&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/doc/toc.json (original)
+++ ant/ivy/ivyde/trunk/doc/toc.json Mon Sep 21 14:39:57 2009
@@ -123,6 +123,13 @@
]
},
{
+ "id":"revdepexplorer",
+ "title":"Reverse Dependency Explorer",
+ "children": [
+
+ ]
+ },
+ {
"id":"dev",
"title":"Developer doc",
"children": [
Added: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/icons/synced.gif
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/icons/synced.gif?rev=817270&view=auto
==============================================================================
Binary file - no diff available.
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/icons/synced.gif
------------------------------------------------------------------------------
svn:mime-type = image/gif
Modified: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/plugin.xml
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/plugin.xml?rev=817270&r1=817269&r2=817270&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/plugin.xml (original)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/plugin.xml Mon Sep 21 14:39:57 2009
@@ -102,6 +102,7 @@
id="org.apache.ivyde.eclipse.ui.actions.IvyDEProjectMenuAction"
label="Ivy"
menubarPath="additions"
+ style="pulldown"
tooltip="Ivy Dependency Manager">
</action>
</objectContribution>
@@ -224,6 +225,14 @@
category="org.apache.ivyde.eclipse.ui.views"
class="org.apache.ivyde.eclipse.ui.views.ReportView">
</view>
+ <view
+ category="org.apache.ivyde.eclipse.ui.views"
+ class="org.apache.ivyde.eclipse.ui.views.ReverseDependencyExplorerView"
+ icon="icons/logo16x16.gif"
+ id="org.apache.ivyde.eclipse.ui.views.ReverseDependencyExplorer"
+ name="Reverse Dependency Explorer"
+ restorable="true">
+ </view>
</extension>
<extension point = "org.eclipse.ui.actionSets">
Modified: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathUtil.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathUtil.java?rev=817270&r1=817269&r2=817270&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathUtil.java (original)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathUtil.java Mon Sep 21 14:39:57 2009
@@ -17,17 +17,24 @@
*/
package org.apache.ivyde.eclipse.cpcontainer;
+import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
+import java.text.ParseException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
+import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
import org.apache.ivyde.eclipse.FakeProjectManager;
import org.apache.ivyde.eclipse.IvyPlugin;
import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
@@ -278,4 +285,30 @@
return null;
}
+ public static List/* <IvyClasspathContainer> */getIvyClasspathContainers(IProject project) {
+ IJavaProject javaProject = JavaCore.create(project);
+ if (javaProject.exists()) {
+ return getIvyClasspathContainers(javaProject);
+ }
+ return Arrays.asList(new IvyClasspathContainer[] {});
+ }
+
+ /**
+ * Rewrites the module descriptor back to project's ivy file.
+ *
+ * @throws IOException
+ * @throws ParseException
+ */
+ public static void toIvyFile(ModuleDescriptor descriptor, IvyClasspathContainer container)
+ throws ParseException, IOException {
+ IvyClasspathContainerConfiguration conf = container.getConf();
+ // TODO the ivy file might not be in the workspace or may be an absolute path
+ // in a such case the Eclipse API will state the file a read only
+ IFile ivyFile = conf.getJavaProject().getProject().getFile(conf.getIvyXmlPath());
+ IStatus writable = ivyFile.getWorkspace().validateEdit(new IFile[] {ivyFile},
+ IWorkspace.VALIDATE_PROMPT);
+ if (writable.isOK()) {
+ descriptor.toIvyFile(container.getState().getIvyFile());
+ }
+ }
}
Added: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java?rev=817270&view=auto
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java (added)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java Mon Sep 21 14:39:57 2009
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.ivyde.eclipse.revdepexplorer;
+
+import java.util.Map;
+
+import org.apache.ivy.core.module.descriptor.DependencyArtifactDescriptor;
+import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
+import org.apache.ivy.core.module.descriptor.ExcludeRule;
+import org.apache.ivy.core.module.descriptor.IncludeRule;
+import org.apache.ivy.core.module.id.ArtifactId;
+import org.apache.ivy.core.module.id.ModuleId;
+import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.plugins.namespace.Namespace;
+
+/**
+ * Delegate dependency descriptor that makes the descriptor mutable. <br>
+ */
+public class EditableDependencyDescriptor implements DependencyDescriptor {
+
+ private DependencyDescriptor descriptor;
+
+ private ModuleRevisionId revisionId;
+
+ public EditableDependencyDescriptor(DependencyDescriptor dd) {
+ descriptor = dd;
+ revisionId = dd.getDependencyRevisionId();
+ }
+
+ public void setRevision(String revision) {
+ revisionId = new ModuleRevisionId(getDependencyId(), revision);
+ }
+
+ public ModuleRevisionId getDynamicConstraintDependencyRevisionId() {
+ return revisionId;
+ }
+
+ public ModuleRevisionId getDependencyRevisionId() {
+ return revisionId;
+ }
+
+ public DependencyDescriptor asSystem() {
+ return descriptor.asSystem();
+ }
+
+ public boolean canExclude() {
+ return descriptor.canExclude();
+ }
+
+ public DependencyDescriptor clone(ModuleRevisionId revision) {
+ return descriptor.clone(revision);
+ }
+
+ public boolean doesExclude(String[] moduleConfigurations, ArtifactId artifactId) {
+ return descriptor.doesExclude(moduleConfigurations, artifactId);
+ }
+
+ public DependencyArtifactDescriptor[] getAllDependencyArtifacts() {
+ return descriptor.getAllDependencyArtifacts();
+ }
+
+ public ExcludeRule[] getAllExcludeRules() {
+ return descriptor.getAllExcludeRules();
+ }
+
+ public IncludeRule[] getAllIncludeRules() {
+ return descriptor.getAllIncludeRules();
+ }
+
+ public String getAttribute(String attName) {
+ return descriptor.getAttribute(attName);
+ }
+
+ public Map getAttributes() {
+ return descriptor.getAttributes();
+ }
+
+ public DependencyArtifactDescriptor[] getDependencyArtifacts(String moduleConfigurations) {
+ return descriptor.getDependencyArtifacts(moduleConfigurations);
+ }
+
+ public DependencyArtifactDescriptor[] getDependencyArtifacts(String[] moduleConfigurations) {
+ return descriptor.getDependencyArtifacts(moduleConfigurations);
+ }
+
+ public String[] getDependencyConfigurations(String moduleConfiguration,
+ String requestedConfiguration) {
+ return descriptor.getDependencyConfigurations(moduleConfiguration, requestedConfiguration);
+ }
+
+ public String[] getDependencyConfigurations(String moduleConfiguration) {
+ return descriptor.getDependencyConfigurations(moduleConfiguration);
+ }
+
+ public String[] getDependencyConfigurations(String[] moduleConfigurations) {
+ return descriptor.getDependencyConfigurations(moduleConfigurations);
+ }
+
+ public ModuleId getDependencyId() {
+ return descriptor.getDependencyId();
+ }
+
+ public ExcludeRule[] getExcludeRules(String moduleConfigurations) {
+ return descriptor.getExcludeRules(moduleConfigurations);
+ }
+
+ public ExcludeRule[] getExcludeRules(String[] moduleConfigurations) {
+ return descriptor.getExcludeRules(moduleConfigurations);
+ }
+
+ public String getExtraAttribute(String attName) {
+ return descriptor.getExtraAttribute(attName);
+ }
+
+ public Map getExtraAttributes() {
+ return descriptor.getExtraAttributes();
+ }
+
+ public IncludeRule[] getIncludeRules(String moduleConfigurations) {
+ return descriptor.getIncludeRules(moduleConfigurations);
+ }
+
+ public IncludeRule[] getIncludeRules(String[] moduleConfigurations) {
+ return descriptor.getIncludeRules(moduleConfigurations);
+ }
+
+ public String[] getModuleConfigurations() {
+ return descriptor.getModuleConfigurations();
+ }
+
+ public Namespace getNamespace() {
+ return descriptor.getNamespace();
+ }
+
+ public ModuleRevisionId getParentRevisionId() {
+ return descriptor.getParentRevisionId();
+ }
+
+ public Map getQualifiedExtraAttributes() {
+ return descriptor.getQualifiedExtraAttributes();
+ }
+
+ public boolean isChanging() {
+ return descriptor.isChanging();
+ }
+
+ public boolean isForce() {
+ return descriptor.isForce();
+ }
+
+ public boolean isTransitive() {
+ return descriptor.isTransitive();
+ }
+}
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java?rev=817270&view=auto
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java (added)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java Mon Sep 21 14:39:57 2009
@@ -0,0 +1,354 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.ivyde.eclipse.revdepexplorer;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.ivy.core.module.descriptor.Artifact;
+import org.apache.ivy.core.module.descriptor.Configuration;
+import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
+import org.apache.ivy.core.module.descriptor.ExcludeRule;
+import org.apache.ivy.core.module.descriptor.License;
+import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
+import org.apache.ivy.core.module.id.ArtifactId;
+import org.apache.ivy.core.module.id.ModuleId;
+import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.module.id.ModuleRules;
+import org.apache.ivy.plugins.conflict.ConflictManager;
+import org.apache.ivy.plugins.parser.ModuleDescriptorParser;
+import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorWriter;
+import org.apache.ivy.plugins.repository.Resource;
+import org.apache.ivy.plugins.version.VersionMatcher;
+
+/**
+ * This is a editable implementation of a module descriptor; this was created so a module descriptor
+ * could be modified. This could go away if ivy ever exposes a descriptor where dependencies can be
+ * added/removed. <br>
+ */
+public class EditableModuleDescriptor implements ModuleDescriptor {
+ private ModuleDescriptor descriptor;
+
+ private Set/* <DependencyDescriptor> */dependencies;
+
+ private DependencyDescriptorDelta delta = new DependencyDescriptorDelta();
+
+ private static final Comparator/* <DependencyDescriptor> */DEFAULT_DEPENDENCY_COMPARATOR = new Comparator() {
+ public int compare(Object o1, Object o2) {
+ int result = 0;
+
+ DependencyDescriptor desc1 = (DependencyDescriptor) o1;
+ DependencyDescriptor desc2 = (DependencyDescriptor) o2;
+
+ result = desc1.getDependencyId().getOrganisation().compareTo(
+ desc2.getDependencyId().getOrganisation());
+
+ if (result == 0) {
+ result = desc1.getDependencyId().getName().compareTo(
+ desc2.getDependencyId().getName());
+ }
+
+ return result;
+ }
+ };
+
+ public EditableModuleDescriptor(ModuleDescriptor descriptor) {
+ this.descriptor = descriptor;
+ dependencies = new TreeSet/* <DependencyDescriptor> */(DEFAULT_DEPENDENCY_COMPARATOR);
+ dependencies.addAll(Arrays.asList(descriptor.getDependencies()));
+ }
+
+ public void removeDependency(DependencyDescriptor remove) {
+ DependencyDescriptor ddToRemove;
+ if ((ddToRemove = findDependencyDescriptor(dependencies, remove)) != null) {
+ delta.remove(ddToRemove);
+ dependencies.remove(ddToRemove);
+ }
+ }
+
+ public void addDependency(DependencyDescriptor add) {
+ add.getDependencyConfigurations(add.getModuleConfigurations());
+
+ if (findDependencyDescriptor(dependencies, add) == null) {
+ delta.add(add);
+ dependencies.add(add);
+ }
+ }
+
+ public void removeDependencies(DependencyDescriptor[] removes) {
+ for (int i = 0; i < removes.length; i++) {
+ removeDependency(removes[i]);
+ }
+ }
+
+ public void removeDependencies(Collection/* <DependencyDescriptor> */removes) {
+ removeDependencies((DependencyDescriptor[]) removes
+ .toArray(new DependencyDescriptor[removes.size()]));
+ }
+
+ public void addDependencies(DependencyDescriptor[] additions) {
+ for (int i = 0; i < additions.length; i++)
+ addDependency(additions[i]);
+ }
+
+ public void addDependencies(Collection/* <DependencyDescriptor> */additions) {
+ addDependencies((DependencyDescriptor[]) additions
+ .toArray(new DependencyDescriptor[additions.size()]));
+ }
+
+ public DependencyDescriptor[] getDependencies() {
+ return (DependencyDescriptor[]) dependencies.toArray(new DependencyDescriptor[dependencies
+ .size()]);
+ }
+
+ public boolean isEdited() {
+ return !delta.isEmpty();
+ }
+
+ public boolean dependsOn(VersionMatcher matcher, ModuleDescriptor md) {
+ for (Iterator iter = dependencies.iterator(); iter.hasNext();) {
+ DependencyDescriptor dd = (DependencyDescriptor) iter.next();
+ if (dd.getDependencyId().equals(md.getModuleRevisionId().getModuleId())) {
+ if (md.getResolvedModuleRevisionId().getRevision() == null) {
+ return true;
+ }
+ if (matcher.accept(dd.getDependencyRevisionId(), md)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Careful - This method bypasses the module descriptor Parser and Resource and delegates
+ * directly to XmlModuleDescriptorWriter.
+ *
+ * @see org.apache.ivy.core.module.descriptor.ModuleDescriptor#toIvyFile(java.io.File)
+ */
+ public void toIvyFile(File destFile) throws ParseException, IOException {
+ XmlModuleDescriptorWriter.write(this, destFile);
+ }
+
+ private DependencyDescriptor findDependencyDescriptor(
+ Collection/* <DependencyDescriptor> */findIn, DependencyDescriptor find) {
+ Iterator iter = findIn.iterator();
+ while (iter.hasNext()) {
+ DependencyDescriptor dependency = (DependencyDescriptor) iter.next();
+ if (dependency.getDependencyRevisionId().equals(find.getDependencyRevisionId())) {
+ return dependency;
+ }
+ }
+
+ return null;
+ }
+
+ // Delegate all of the interface methods ---------------------------------
+
+ public Artifact[] getAllArtifacts() {
+ return descriptor.getAllArtifacts();
+ }
+
+ public Artifact[] getArtifacts(String s) {
+ return descriptor.getArtifacts(s);
+ }
+
+ public String getAttribute(String s) {
+ return descriptor.getAttribute(s);
+ }
+
+ public Map getAttributes() {
+ return descriptor.getAttributes();
+ }
+
+ public Configuration getConfiguration(String s) {
+ return descriptor.getConfiguration(s);
+ }
+
+ public Configuration[] getConfigurations() {
+ return descriptor.getConfigurations();
+ }
+
+ public String[] getConfigurationsNames() {
+ return descriptor.getConfigurationsNames();
+ }
+
+ public ConflictManager getConflictManager(ModuleId moduleid) {
+ return descriptor.getConflictManager(moduleid);
+ }
+
+ public String getExtraAttribute(String s) {
+ return descriptor.getExtraAttribute(s);
+ }
+
+ public Map getExtraAttributes() {
+ return descriptor.getExtraAttributes();
+ }
+
+ public String getHomePage() {
+ return descriptor.getHomePage();
+ }
+
+ public long getLastModified() {
+ return descriptor.getLastModified();
+ }
+
+ public License[] getLicenses() {
+ return descriptor.getLicenses();
+ }
+
+ public ModuleRevisionId getModuleRevisionId() {
+ return descriptor.getModuleRevisionId();
+ }
+
+ public ModuleDescriptorParser getParser() {
+ return descriptor.getParser();
+ }
+
+ public Date getPublicationDate() {
+ return descriptor.getPublicationDate();
+ }
+
+ public String[] getPublicConfigurationsNames() {
+ return descriptor.getPublicConfigurationsNames();
+ }
+
+ public ModuleRevisionId getResolvedModuleRevisionId() {
+ return ModuleRevisionId.newInstance(descriptor.getResolvedModuleRevisionId()
+ .getOrganisation(), descriptor.getResolvedModuleRevisionId().getName(), "revision");
+ }
+
+ public Date getResolvedPublicationDate() {
+ return descriptor.getResolvedPublicationDate();
+ }
+
+ public Resource getResource() {
+ return descriptor.getResource();
+ }
+
+ public String getStatus() {
+ return descriptor.getStatus();
+ }
+
+ public boolean isDefault() {
+ return descriptor.isDefault();
+ }
+
+ public boolean canExclude() {
+ return descriptor.canExclude();
+ }
+
+ public boolean doesExclude(String[] as, ArtifactId artifactid) {
+ return descriptor.doesExclude(as, artifactid);
+ }
+
+ public ExcludeRule[] getAllExcludeRules() {
+ return descriptor.getAllExcludeRules();
+ }
+
+ public void setResolvedModuleRevisionId(ModuleRevisionId modulerevisionid) {
+ descriptor.setResolvedModuleRevisionId(modulerevisionid);
+ }
+
+ public void setResolvedPublicationDate(Date date) {
+ descriptor.setResolvedPublicationDate(date);
+ }
+
+ protected class DependencyDescriptorDelta {
+ private Set/* <DependencyDescriptor> */added = new HashSet();
+
+ private Set/* <DependencyDescriptor> */deleted = new HashSet();
+
+ public void add(DependencyDescriptor dependency) {
+ DependencyDescriptor ddToRemove;
+ if ((ddToRemove = findDependencyDescriptor(deleted, dependency)) != null) {
+ deleted.remove(ddToRemove);
+ } else {
+ added.add(dependency);
+ }
+ }
+
+ public void remove(DependencyDescriptor dependency) {
+ DependencyDescriptor ddToRemove;
+ if ((ddToRemove = findDependencyDescriptor(added, dependency)) != null) {
+ added.remove(ddToRemove);
+ } else {
+ deleted.add(dependency);
+ }
+ }
+
+ public void clear() {
+ added = new HashSet/* <DependencyDescriptor> */();
+ deleted = new HashSet/* <DependencyDescriptor> */();
+ }
+
+ public boolean isEmpty() {
+ return added.size() == 0 && deleted.size() == 0;
+ }
+
+ public Collection/* <DependencyDescriptor> */getDeletedDeltas() {
+ return deleted;
+ }
+
+ public Collection/* <DependencyDescriptor> */getAddedDeltas() {
+ return added;
+ }
+ }
+
+ public Map getExtraAttributesNamespaces() {
+ return descriptor.getExtraAttributesNamespaces();
+ }
+
+ public Map getExtraInfo() {
+ return descriptor.getExtraInfo();
+ }
+
+ public Artifact getMetadataArtifact() {
+ return descriptor.getMetadataArtifact();
+ }
+
+ public Map getQualifiedExtraAttributes() {
+ return descriptor.getQualifiedExtraAttributes();
+ }
+
+ public String getRevision() {
+ return descriptor.getRevision();
+ }
+
+ public ModuleRules getAllDependencyDescriptorMediators() {
+ return descriptor.getAllDependencyDescriptorMediators();
+ }
+ public String getDescription() {
+ return descriptor.getDescription();
+ }
+
+ public DependencyDescriptor mediate(DependencyDescriptor arg0) {
+ return descriptor.mediate(arg0);
+ }
+}
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/IvyUtil.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/IvyUtil.java?rev=817270&view=auto
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/IvyUtil.java (added)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/IvyUtil.java Mon Sep 21 14:39:57 2009
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.ivyde.eclipse.revdepexplorer;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
+import org.apache.ivyde.eclipse.IvyDEException;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathContainer;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathUtil;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+
+public class IvyUtil {
+
+ /**
+ * This will return all ivy projects in the workspace <br>
+ *
+ * @return collection of ivy projects
+ */
+ public static IProject[] getIvyProjectsInWorkspace() {
+ Collection/* <IProject> */ivyProjects = new HashSet();
+
+ IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+
+ for (int i = 0; i < projects.length; i++) {
+ if (projects[i].isOpen()
+ && IvyClasspathUtil.getIvyClasspathContainers(projects[i]).size() > 0) {
+ ivyProjects.add(projects[i]);
+ }
+ }
+
+ return (IProject[]) ivyProjects.toArray(new IProject[ivyProjects.size()]);
+ }
+
+ public static MultiRevisionDependencyDescriptor[] getDependencyDescriptorsByProjects(
+ IProject[] projects) {
+ // a temporary cache of multi-revision dependency descriptors
+ Map/* <ModuleId, MultiRevisionDependencyDescriptor> */moduleDescriptorMap = new HashMap();
+
+ for (int i = 0; i < projects.length; i++) {
+ List containers = IvyClasspathUtil.getIvyClasspathContainers(projects[i]);
+ Iterator containerIter = containers.iterator();
+
+ while (containerIter.hasNext()) {
+ IvyClasspathContainer container = (IvyClasspathContainer) containerIter.next();
+ try {
+ DependencyDescriptor[] descriptors = container.getState().getModuleDescriptor()
+ .getDependencies();
+ for (int j = 0; j < descriptors.length; j++) {
+ DependencyDescriptor descriptor = descriptors[j];
+ MultiRevisionDependencyDescriptor syncableDependencyDescriptor = (MultiRevisionDependencyDescriptor) moduleDescriptorMap
+ .get(descriptor.getDependencyId());
+
+ if (syncableDependencyDescriptor == null) {
+ syncableDependencyDescriptor = new MultiRevisionDependencyDescriptor(
+ descriptor.getDependencyId());
+
+ moduleDescriptorMap.put(descriptor.getDependencyId(),
+ syncableDependencyDescriptor);
+ }
+
+ syncableDependencyDescriptor.addDependencyDescriptor(container, descriptor);
+ }
+ } catch (IvyDEException e) {
+ e.show(IStatus.ERROR, "Inconsistent Ivy Classpath Container",
+ "Unable to find a module descriptor associated with"
+ + container.getState().getIvyFile().getPath());
+ continue;
+ }
+ }
+ }
+
+ List/* <MultiRevisionDependencyDescriptor> */sorted = new ArrayList(moduleDescriptorMap
+ .values());
+
+ Collections.sort(sorted, new Comparator/* <MultiRevisionDependencyDescriptor> */() {
+ public int compare(Object o1, Object o2) {
+ MultiRevisionDependencyDescriptor desc1 = (MultiRevisionDependencyDescriptor) o1;
+ MultiRevisionDependencyDescriptor desc2 = (MultiRevisionDependencyDescriptor) o2;
+
+ int equal = desc1.getOrganization().compareTo(desc2.getOrganization());
+ if (equal == 0) {
+ equal = desc1.getModule().compareTo(desc2.getModule());
+ }
+
+ return equal;
+
+ }
+ });
+
+ return (MultiRevisionDependencyDescriptor[]) sorted
+ .toArray(new MultiRevisionDependencyDescriptor[sorted.size()]);
+ }
+
+ /**
+ * This returns a list of multi-revision dependency descriptors which is a grouping of the
+ * revisions under and organization and module <br>
+ *
+ * @return multi-revision dependency descriptors
+ */
+ public static MultiRevisionDependencyDescriptor[] getAllDependencyDescriptorsInWorkspace() {
+ return getDependencyDescriptorsByProjects(getIvyProjectsInWorkspace());
+ }
+}
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/IvyUtil.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/IvyUtil.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/IvyUtil.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/MultiRevisionDependencyDescriptor.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/MultiRevisionDependencyDescriptor.java?rev=817270&view=auto
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/MultiRevisionDependencyDescriptor.java (added)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/MultiRevisionDependencyDescriptor.java Mon Sep 21 14:39:57 2009
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.ivyde.eclipse.revdepexplorer;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
+import org.apache.ivy.core.module.id.ModuleId;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathContainer;
+
+public class MultiRevisionDependencyDescriptor {
+ private final ModuleId moduleId;
+
+ private final Map/* <IvyClasspathContainer, Collection<DependencyDescriptor>> */dependenciesByContainer = new HashMap();
+
+ private String newRevision;
+
+ public MultiRevisionDependencyDescriptor(ModuleId moduleId) {
+ this.moduleId = moduleId;
+ }
+
+ public int hashCode() {
+ return getOrganization().hashCode() + getModule().hashCode()
+ + dependenciesByContainer.hashCode();
+ }
+
+ public boolean equals(Object o) {
+ if (o instanceof MultiRevisionDependencyDescriptor) {
+ MultiRevisionDependencyDescriptor dependencyDescriptor = (MultiRevisionDependencyDescriptor) o;
+
+ if (getOrganization().equals(dependencyDescriptor.getOrganization())
+ && getModule().equals(dependencyDescriptor.getModule())
+ && dependenciesByContainer.equals(dependencyDescriptor.dependenciesByContainer)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public boolean hasMultipleRevisons() {
+ return getRevisions().length > 1;
+ }
+
+ /**
+ * @param project
+ * revision
+ * @param dependencyDescriptor
+ * current descriptor
+ */
+ public void addDependencyDescriptor(IvyClasspathContainer container,
+ DependencyDescriptor dependencyDescriptor) {
+ Collection/* <DependencyDescriptor> */dependencies = (Collection) dependenciesByContainer
+ .get(container);
+
+ if (dependencies == null) {
+ dependencies = new HashSet/* <DependencyDescriptor> */();
+ dependenciesByContainer.put(container, dependencies);
+ }
+
+ dependencies.add(dependencyDescriptor);
+ }
+
+ /**
+ * @return module name
+ */
+ public String getModule() {
+ return moduleId.getName();
+ }
+
+ /**
+ * @return organization name
+ */
+ public String getOrganization() {
+ return moduleId.getOrganisation();
+ }
+
+ /**
+ * @return all revisions
+ */
+ public String[] getRevisions() {
+ Set/* <String> */revisions = new HashSet/* <String> */();
+
+ Collection/* <Collection<DependencyDescriptor>> */projectDependencyDescriptors = dependenciesByContainer
+ .values();
+
+ Iterator projectCollectionIter = projectDependencyDescriptors.iterator();
+ while (projectCollectionIter.hasNext()) {
+ Collection/* <DependencyDescriptor> */projectCollection = (Collection) projectCollectionIter
+ .next();
+ Iterator descriptorIter = projectCollection.iterator();
+ while (descriptorIter.hasNext()) {
+ DependencyDescriptor descriptor = (DependencyDescriptor) descriptorIter.next();
+ revisions.add(descriptor.getDependencyRevisionId().getRevision());
+ }
+ }
+
+ return (String[]) revisions.toArray(new String[revisions.size()]);
+ }
+
+ /**
+ * @return true if a new revision has been applied
+ */
+ public boolean hasNewRevision() {
+ if (newRevision == null || "".equals(newRevision.trim())) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * @param newRevision
+ * new revision
+ */
+ public void setNewRevision(String newRevision) {
+ this.newRevision = newRevision;
+ }
+
+ /**
+ * @return new revision
+ */
+ public String getNewRevision() {
+ return newRevision;
+ }
+
+ /**
+ * @return all projects
+ */
+ public IvyClasspathContainer[] getIvyClasspathContainers() {
+ Collection containers = dependenciesByContainer.keySet();
+ return (IvyClasspathContainer[]) containers.toArray(new IvyClasspathContainer[containers
+ .size()]);
+ }
+
+ /**
+ * @param project
+ * project
+ * @return true if there is a project match
+ */
+ public boolean isForContainer(IvyClasspathContainer container) {
+ IvyClasspathContainer[] containers = getIvyClasspathContainers();
+ for (int i = 0; i < containers.length; i++) {
+ IvyClasspathContainer currentContainer = containers[i];
+ if (currentContainer.equals(container)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @return
+ */
+ public ModuleId getModuleId() {
+ return moduleId;
+ }
+
+ /**
+ * This returns the current revisions for a project <br>
+ *
+ * @param project
+ * project
+ * @return revision
+ */
+ public String[] getRevisions(IvyClasspathContainer container) {
+ Collection/* <DependencyDescriptor> */containerDependencyDescriptors = (Collection) dependenciesByContainer
+ .get(container);
+
+ if (containerDependencyDescriptors == null) {
+ return new String[0];
+ }
+
+ Set/* <String> */revisions = new HashSet/* <String> */();
+
+ Iterator iter = containerDependencyDescriptors.iterator();
+ while (iter.hasNext()) {
+ DependencyDescriptor descriptor = (DependencyDescriptor) iter.next();
+ revisions.add(descriptor.getDependencyRevisionId().getRevision());
+ }
+
+ return (String[]) revisions.toArray(new String[revisions.size()]);
+ }
+}
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/MultiRevisionDependencyDescriptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/MultiRevisionDependencyDescriptor.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/MultiRevisionDependencyDescriptor.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java?rev=817270&view=auto
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java (added)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java Mon Sep 21 14:39:57 2009
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.ivyde.eclipse.revdepexplorer;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
+import org.apache.ivyde.eclipse.IvyDEException;
+import org.apache.ivyde.eclipse.IvyPlugin;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathContainer;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathUtil;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+
+/**
+ * This job synchronizes all ivy files in a workspace according to the new revisions specified in
+ * the ivy explorer.
+ */
+public class SyncIvyFilesJob extends WorkspaceJob {
+
+ private MultiRevisionDependencyDescriptor[] multiRevisionDependencies;
+
+ public SyncIvyFilesJob(MultiRevisionDependencyDescriptor[] multiRevisionDependencies) {
+ super("Synchronizing Ivy Files");
+ this.multiRevisionDependencies = multiRevisionDependencies;
+ }
+
+ protected IStatus executeJob(IProgressMonitor monitor) {
+ MultiStatus errorStatuses = new MultiStatus(IvyPlugin.ID, IStatus.ERROR,
+ "Failed to update one or more Ivy files. See details.", null);
+
+ IvyClasspathContainer[] containers = getIvyClasspathContainers();
+ for (int i = 0; i < containers.length; i++) {
+ IvyClasspathContainer container = containers[i];
+
+ EditableModuleDescriptor moduleDescriptor;
+ try {
+ moduleDescriptor = new EditableModuleDescriptor(container.getState()
+ .getModuleDescriptor());
+ } catch (IvyDEException e) {
+ errorStatuses
+ .add(new Status(IStatus.ERROR, IvyPlugin.ID, IStatus.ERROR,
+ "Failed to get module descriptor at "
+ + container.getConf().getIvyXmlPath(), e));
+ continue;
+ }
+ Collection/* <MultiRevisionDependencyDescriptor> */newRevisions = getNewRevisions(container);
+
+ Iterator multiRevisionIter = newRevisions.iterator();
+ while (multiRevisionIter.hasNext()) {
+ MultiRevisionDependencyDescriptor newRevision = (MultiRevisionDependencyDescriptor) multiRevisionIter
+ .next();
+
+ DependencyDescriptor dependencyDescriptors[] = moduleDescriptor.getDependencies();
+ for (int j = 0; j < dependencyDescriptors.length; j++) {
+ DependencyDescriptor dependencyDescriptor = dependencyDescriptors[j];
+ if (newRevision.getModuleId().equals(dependencyDescriptor.getDependencyId())) {
+ EditableDependencyDescriptor editableDependencyDescriptor = new EditableDependencyDescriptor(
+ dependencyDescriptor);
+ editableDependencyDescriptor.setRevision(newRevision.getNewRevision());
+ moduleDescriptor.removeDependency(dependencyDescriptor);
+ moduleDescriptor.addDependency(editableDependencyDescriptor);
+ }
+ }
+ }
+
+ try {
+ IvyClasspathUtil.toIvyFile(moduleDescriptor, container);
+ } catch (ParseException e) {
+ errorStatuses.add(new Status(IStatus.ERROR, IvyPlugin.ID, IStatus.ERROR,
+ "Failed to write Ivy file " + container.getState().getIvyFile().getPath(),
+ e));
+ } catch (IOException e) {
+ errorStatuses.add(new Status(IStatus.ERROR, IvyPlugin.ID, IStatus.ERROR,
+ "Failed to write Ivy file " + container.getState().getIvyFile().getPath(),
+ e));
+ }
+ }
+
+ if (errorStatuses.getChildren().length > 0) {
+ return errorStatuses;
+ }
+ return Status.OK_STATUS;
+ }
+
+ public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+ IStatus status = Status.OK_STATUS;
+
+ try {
+ status = executeJob(monitor);
+ } catch (OperationCanceledException ignore) {
+ return Status.CANCEL_STATUS;
+ }
+
+ return status;
+ }
+
+ private IvyClasspathContainer[] getIvyClasspathContainers() {
+ Collection/* <IvyClasspathContainer> */containers = new HashSet();
+
+ for (int i = 0; i < multiRevisionDependencies.length; i++) {
+ MultiRevisionDependencyDescriptor multiRevision = multiRevisionDependencies[i];
+ if (multiRevision.hasNewRevision()) {
+ containers.addAll(Arrays.asList(multiRevision.getIvyClasspathContainers()));
+ }
+ }
+
+ return (IvyClasspathContainer[]) containers.toArray(new IvyClasspathContainer[containers
+ .size()]);
+ }
+
+ /**
+ * Return the new revision changes for a given project <br>
+ *
+ * @param project
+ * project
+ * @return multiRevision descriptors
+ */
+ private Collection/* <MultiRevisionDependencyDescriptor> */getNewRevisions(
+ IvyClasspathContainer container) {
+ Collection/* <MultiRevisionDependencyDescriptor> */list = new ArrayList();
+
+ for (int i = 0; i < multiRevisionDependencies.length; i++) {
+ MultiRevisionDependencyDescriptor multiRevision = multiRevisionDependencies[i];
+ if (multiRevision.hasNewRevision() && multiRevision.isForContainer(container)) {
+ list.add(multiRevision);
+ }
+ }
+
+ return list;
+ }
+}
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/IvyDEProjectAction.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/IvyDEProjectAction.java?rev=817270&r1=817269&r2=817270&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/IvyDEProjectAction.java (original)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/IvyDEProjectAction.java Mon Sep 21 14:39:57 2009
@@ -26,21 +26,25 @@
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
/**
* Abstract class for helping with project delegation of actions <br>
*/
-public abstract class IvyDEProjectAction implements IActionDelegate {
+public abstract class IvyDEProjectAction implements IObjectActionDelegate {
protected abstract void selectionChanged(IAction action, IProject[] projects);
-
- /**
- * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
- * org.eclipse.jface.viewers.ISelection)
- */
+
+ protected IWorkbenchPage page;
+
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ this.page = targetPart.getSite().getPage();
+ }
+
public final void selectionChanged(IAction action, ISelection selection) {
if (selection instanceof IStructuredSelection) {
- Collection/*<IProject>*/ projects = new ArrayList/*<IProject>*/();
+ Collection/* <IProject> */projects = new ArrayList/* <IProject> */();
for (Iterator it = ((IStructuredSelection) selection).iterator(); it.hasNext();) {
Object element = it.next();
@@ -52,18 +56,23 @@
}
if (project != null) {
- // TODO validate a project's "Ivy nature" here (has an ivy.xml or an ivy classpath container)
+ // TODO validate a project's "Ivy nature" here (has an ivy.xml or an ivy
+ // classpath container)
projects.add(project);
}
}
-
- if(projects.size() > 0) {
+
+ if (projects.size() > 0) {
action.setEnabled(true);
- selectionChanged(action, (IProject[]) projects.toArray(new IProject[projects.size()]));
- }
- else {
+ selectionChanged(action, (IProject[]) projects
+ .toArray(new IProject[projects.size()]));
+ } else {
action.setEnabled(false);
}
}
}
+
+ protected IWorkbenchPage getPage() {
+ return page;
+ }
}
Modified: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/IvyDEProjectMenuAction.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/IvyDEProjectMenuAction.java?rev=817270&r1=817269&r2=817270&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/IvyDEProjectMenuAction.java (original)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/IvyDEProjectMenuAction.java Mon Sep 21 14:39:57 2009
@@ -21,6 +21,7 @@
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.action.Separator;
import org.eclipse.swt.events.MenuAdapter;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.MenuListener;
@@ -30,7 +31,9 @@
public class IvyDEProjectMenuAction extends IvyDEProjectAction implements IMenuCreator {
private boolean selectionChanged;
+
private IAction proxyAction;
+
private IProject[] projects;
private MenuListener menuListener = new MenuAdapter() {
@@ -49,7 +52,12 @@
protected void fill(Menu menu, IProject[] projects) {
ProjectResolveAction resolveAction = new ProjectResolveAction(projects);
+ ProjectViewReverseDependenciesAction viewReverseAction = new ProjectViewReverseDependenciesAction(
+ projects, getPage());
+
new ActionContributionItem(resolveAction).fill(menu, -1);
+ new Separator().fill(menu, -1);
+ new ActionContributionItem(viewReverseAction).fill(menu, -1);
}
public Menu getMenu(Control parent) {
@@ -74,10 +82,10 @@
proxyAction.setMenuCreator(this);
}
}
-
+
public void run(IAction action) {
// nothing to run
- }
+ }
public void dispose() {
// nothing to dispose
Added: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ProjectViewReverseDependenciesAction.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ProjectViewReverseDependenciesAction.java?rev=817270&view=auto
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ProjectViewReverseDependenciesAction.java (added)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ProjectViewReverseDependenciesAction.java Mon Sep 21 14:39:57 2009
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.ivyde.eclipse.ui.actions;
+
+import org.apache.ivyde.eclipse.IvyPlugin;
+import org.apache.ivyde.eclipse.ui.views.ReverseDependencyExplorerView;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+
+public class ProjectViewReverseDependenciesAction extends Action {
+
+ private IProject[] projects;
+
+ private IWorkbenchPage page;
+
+ public ProjectViewReverseDependenciesAction(IProject[] projects, IWorkbenchPage workbenchPage) {
+ this.projects = projects;
+ this.page = workbenchPage;
+ this.setText("Show in Reverse Dependency Explorer");
+ }
+
+ public void run() {
+ try {
+ ReverseDependencyExplorerView.setSelectedProjects(projects);
+ page.showView("org.apache.ivyde.eclipse.ui.views.ReverseDependencyExplorer");
+ ReverseDependencyExplorerView.refresh(true);
+ } catch (PartInitException e) {
+ IvyPlugin.log(IStatus.ERROR, "Error creating Reverse Dependency Explorer", e);
+ }
+ }
+}
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ProjectViewReverseDependenciesAction.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ProjectViewReverseDependenciesAction.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ProjectViewReverseDependenciesAction.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/views/ReverseDependencyExplorerView.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/views/ReverseDependencyExplorerView.java?rev=817270&view=auto
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/views/ReverseDependencyExplorerView.java (added)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/views/ReverseDependencyExplorerView.java Mon Sep 21 14:39:57 2009
@@ -0,0 +1,407 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.ivyde.eclipse.ui.views;
+
+import org.apache.ivyde.eclipse.IvyPlugin;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathContainer;
+import org.apache.ivyde.eclipse.revdepexplorer.IvyUtil;
+import org.apache.ivyde.eclipse.revdepexplorer.MultiRevisionDependencyDescriptor;
+import org.apache.ivyde.eclipse.revdepexplorer.SyncIvyFilesJob;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * This is a view to manage synchronizing ivy files in a workspace
+ */
+public class ReverseDependencyExplorerView extends ViewPart {
+ private static TreeViewer viewer;
+
+ private static MultiRevisionDependencyDescriptor[] dependencies;
+
+ private static Display display;
+
+ private static IProject[] selectedProjects;
+
+ private static final String NEW_REVISION = "New Revision";
+
+ private static final String[] PROPS = new String[] {"Organization", "Module", "Revision",
+ NEW_REVISION};
+
+ /**
+ * This is a callback that will allow us to create the viewer and initialize it.
+ */
+ public void createPartControl(Composite parent) {
+ display = parent.getDisplay();
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(1, false));
+
+ ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
+
+ Action syncAction = new Action() {
+ public void run() {
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
+ "Fix dependencies",
+ "Alter dependencies?\n\nAnything marked in green will be synchronized.")) {
+ Job job = new SyncIvyFilesJob(dependencies);
+ job.addJobChangeListener(new JobChangeAdapter() {
+ public void done(IJobChangeEvent arg0) {
+ refresh(true);
+ }
+ });
+ job.schedule();
+ }
+ }
+ };
+ syncAction.setToolTipText("Synchronize ivy dependencies");
+ syncAction.setImageDescriptor(IvyPlugin.getImageDescriptor("icons/synced.gif"));
+
+ Action refreshAction = new Action() {
+ public void run() {
+ refresh(true);
+ }
+ };
+ refreshAction.setToolTipText("Refresh");
+ refreshAction.setImageDescriptor(IvyPlugin.getImageDescriptor("icons/refresh.gif"));
+
+ Action refreshAllAction = new Action() {
+ public void run() {
+ ReverseDependencyExplorerView.setSelectedProjects(null);
+ refresh(true);
+ }
+ };
+ refreshAllAction.setToolTipText("Show all projects in workspace");
+ refreshAllAction.setImageDescriptor(sharedImages
+ .getImageDescriptor(ISharedImages.IMG_TOOL_UP));
+
+ IToolBarManager toolbar = getViewSite().getActionBars().getToolBarManager();
+ toolbar.add(syncAction);
+ toolbar.add(refreshAction);
+ toolbar.add(refreshAllAction);
+
+ newTreeViewer(composite);
+ refresh(true);
+ }
+
+ private void newTreeViewer(Composite composite) {
+ viewer = new TreeViewer(composite, SWT.FULL_SELECTION);
+ IvyRevisionProvider ivyRevisionProvider = new IvyRevisionProvider();
+
+ viewer.setContentProvider(ivyRevisionProvider);
+ viewer.setLabelProvider(ivyRevisionProvider);
+ viewer.setColumnProperties(PROPS);
+
+ Tree tree = viewer.getTree();
+ tree.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ TableLayout layout = new TableLayout();
+ layout.addColumnData(new ColumnWeightData(50, 75, true));
+ layout.addColumnData(new ColumnWeightData(50, 75, true));
+ layout.addColumnData(new ColumnWeightData(25, 75, true));
+ layout.addColumnData(new ColumnWeightData(50, 75, true));
+ tree.setLayout(layout);
+
+ new TreeColumn(tree, SWT.LEFT).setText("Organization");
+ new TreeColumn(tree, SWT.LEFT).setText("Module");
+ new TreeColumn(tree, SWT.LEFT).setText("Revision");
+ new TreeColumn(tree, SWT.LEFT).setText("New Revision");
+
+ for (int i = 0, n = tree.getColumnCount(); i < n; i++) {
+ tree.getColumn(i).pack();
+ }
+
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(false);
+
+ CellEditor[] editors = new CellEditor[PROPS.length];
+ editors[0] = new TextCellEditor(tree);
+ editors[1] = new TextCellEditor(tree);
+ editors[2] = new TextCellEditor(tree);
+ editors[3] = new TextCellEditor(tree);
+
+ viewer.setCellModifier(new CellModifier());
+ viewer.setCellEditors(editors);
+ }
+
+ public static void refresh(final boolean reloadData) {
+ display.syncExec(new Runnable() {
+ public void run() {
+ if (reloadData) {
+ if (selectedProjects == null) {
+ dependencies = IvyUtil.getAllDependencyDescriptorsInWorkspace();
+ } else {
+ dependencies = IvyUtil.getDependencyDescriptorsByProjects(selectedProjects);
+ }
+ viewer.setInput(dependencies);
+ }
+
+ viewer.refresh();
+
+ TreeItem[] items = viewer.getTree().getItems();
+
+ for (int i = 0; i < items.length; i++) {
+ TreeItem item = items[i];
+ MultiRevisionDependencyDescriptor multiRevisionDescriptor = (MultiRevisionDependencyDescriptor) item
+ .getData();
+
+ if (multiRevisionDescriptor.hasMultipleRevisons()
+ && !multiRevisionDescriptor.hasNewRevision()) {
+ item.setForeground(display.getSystemColor(SWT.COLOR_RED));
+ } else if (multiRevisionDescriptor.hasNewRevision()) {
+ item.setForeground(new Color(Display.getDefault(), new RGB(50, 150, 50)));
+ } else {
+ item.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ public void setFocus() {
+ viewer.getControl().setFocus();
+ }
+
+ class IvyRevisionProvider extends LabelProvider implements ITableLabelProvider,
+ ITreeContentProvider {
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ // nothing to do
+ }
+
+ public Object[] getElements(Object parent) {
+ return dependencies;
+ }
+
+ public String getColumnText(Object obj, int index) {
+ if (obj instanceof MultiRevisionDependencyDescriptor) {
+ MultiRevisionDependencyDescriptor dependencyDescriptor = (MultiRevisionDependencyDescriptor) obj;
+
+ switch (index) {
+ case 0:
+ return dependencyDescriptor.getOrganization();
+ case 1:
+ return dependencyDescriptor.getModule();
+ case 2:
+ return toRevisionList(dependencyDescriptor.getRevisions());
+ case 3:
+ return dependencyDescriptor.getNewRevision();
+ default:
+ break;
+ }
+ } else if (obj instanceof ClasspathContainerDependencyDescriptorComposite) {
+ ClasspathContainerDependencyDescriptorComposite containerDescriptorComposite = (ClasspathContainerDependencyDescriptorComposite) obj;
+ switch (index) {
+ case 0:
+ return containerDescriptorComposite.getIvyClasspathContainer()
+ .getDescription()
+ + " in \""
+ + containerDescriptorComposite.getIvyClasspathContainer().getConf()
+ .getJavaProject().getProject().getName() + "\"";
+ case 2:
+ return toRevisionList(containerDescriptorComposite.getRevisions());
+ default:
+ break;
+ }
+
+ return null;
+ }
+
+ return null;
+ }
+
+ private String toRevisionList(String[] revisions) {
+ StringBuffer buffer = new StringBuffer();
+
+ for (int i = 0; i < revisions.length; i++) {
+ buffer.append(revisions[i]);
+
+ if (i + 1 < revisions.length) {
+ buffer.append(", ");
+ }
+ }
+
+ return buffer.toString();
+ }
+
+ public Image getColumnImage(Object obj, int index) {
+ if (index == 0) {
+ return getImage(obj);
+ }
+
+ return null;
+ }
+
+ public Image getImage(Object obj) {
+ ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
+ if (obj instanceof MultiRevisionDependencyDescriptor) {
+ MultiRevisionDependencyDescriptor multiRevisionDescriptor = (MultiRevisionDependencyDescriptor) obj;
+
+ if (multiRevisionDescriptor.hasMultipleRevisons()
+ && !multiRevisionDescriptor.hasNewRevision()) {
+ return sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
+ } else {
+ return IvyPlugin.getImageDescriptor("icons/synced.gif").createImage();
+ }
+ } else if (obj instanceof ClasspathContainerDependencyDescriptorComposite) {
+ return JavaUI.getSharedImages().getImage(
+ org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_LIBRARY);
+ }
+
+ return null;
+ }
+
+ public Object[] getChildren(Object parent) {
+ if (parent instanceof MultiRevisionDependencyDescriptor) {
+ MultiRevisionDependencyDescriptor multiRevisionDescriptor = (MultiRevisionDependencyDescriptor) parent;
+ IvyClasspathContainer[] containers = multiRevisionDescriptor
+ .getIvyClasspathContainers();
+
+ Object[] wrappedProjects = new Object[containers.length];
+ for (int i = 0; i < containers.length; i++) {
+ wrappedProjects[i] = new ClasspathContainerDependencyDescriptorComposite(
+ containers[i], multiRevisionDescriptor);
+ }
+
+ return wrappedProjects;
+ }
+
+ return new Object[0];
+ }
+
+ public Object getParent(Object parent) {
+ return null;
+ }
+
+ public boolean hasChildren(Object parent) {
+ if (parent instanceof MultiRevisionDependencyDescriptor) {
+ MultiRevisionDependencyDescriptor multiRevisionDescriptor = (MultiRevisionDependencyDescriptor) parent;
+
+ if (multiRevisionDescriptor.getIvyClasspathContainers().length > 0) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+
+ class ClasspathContainerDependencyDescriptorComposite {
+ private IvyClasspathContainer container;
+
+ private MultiRevisionDependencyDescriptor multiRevisionDescriptor;
+
+ public ClasspathContainerDependencyDescriptorComposite(IvyClasspathContainer container,
+ MultiRevisionDependencyDescriptor multiRevisionDescriptor) {
+ this.container = container;
+ this.multiRevisionDescriptor = multiRevisionDescriptor;
+ }
+
+ /**
+ * @return revisions for a container
+ */
+ public String[] getRevisions() {
+ return multiRevisionDescriptor.getRevisions(container);
+ }
+
+ public IvyClasspathContainer getIvyClasspathContainer() {
+ return container;
+ }
+
+ public MultiRevisionDependencyDescriptor getMultiRevisionDescriptor() {
+ return multiRevisionDescriptor;
+ }
+ }
+
+ class CellModifier implements ICellModifier {
+
+ public boolean canModify(Object element, String property) {
+ if (property.equals(NEW_REVISION)) {
+ return true;
+ }
+ return false;
+ }
+
+ public Object getValue(Object element, String property) {
+ if (property.equals(NEW_REVISION)) {
+ if (element instanceof MultiRevisionDependencyDescriptor) {
+ MultiRevisionDependencyDescriptor dependencyDescriptor = (MultiRevisionDependencyDescriptor) element;
+ String revision = dependencyDescriptor.getNewRevision();
+
+ if (revision == null) {
+ return "";
+ } else {
+ return revision;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public void modify(Object element, String property, Object value) {
+ if (element instanceof Item) {
+ element = ((Item) element).getData();
+ }
+
+ if (element instanceof MultiRevisionDependencyDescriptor
+ && property.equals(NEW_REVISION)) {
+ MultiRevisionDependencyDescriptor multiRevisionDescriptor = (MultiRevisionDependencyDescriptor) element;
+ multiRevisionDescriptor.setNewRevision((String) value);
+
+ refresh(false);
+ }
+ }
+ }
+
+ public static void setSelectedProjects(IProject[] projects) {
+ selectedProjects = projects;
+ }
+}
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/views/ReverseDependencyExplorerView.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/views/ReverseDependencyExplorerView.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/views/ReverseDependencyExplorerView.java
------------------------------------------------------------------------------
svn:mime-type = text/plain