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 2014/04/14 00:15:38 UTC

svn commit: r1587111 - in /ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde: eclipse/cp/MappingSetup.java internal/eclipse/cpcontainer/IvyClasspathContainerMapper.java internal/eclipse/resolve/ResolveResult.java

Author: hibou
Date: Sun Apr 13 22:15:38 2014
New Revision: 1587111

URL: http://svn.apache.org/r1587111
Log:
Add proper support for OSGi bundles with embedded jars

Modified:
    ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cp/MappingSetup.java
    ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/internal/eclipse/cpcontainer/IvyClasspathContainerMapper.java
    ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/internal/eclipse/resolve/ResolveResult.java

Modified: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cp/MappingSetup.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cp/MappingSetup.java?rev=1587111&r1=1587110&r2=1587111&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cp/MappingSetup.java (original)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cp/MappingSetup.java Sun Apr 13 22:15:38 2014
@@ -21,13 +21,13 @@ import java.util.List;
 
 public class MappingSetup {
 
-    private List/* <String> */sourceTypes;
+    private List<String> sourceTypes;
 
-    private List/* <String> */javadocTypes;
+    private List<String> javadocTypes;
 
-    private List/* <String> */sourceSuffixes;
+    private List<String> sourceSuffixes;
 
-    private List/* <String> */javadocSuffixes;
+    private List<String> javadocSuffixes;
 
     private boolean mapIfOnlyOneSource = false;
 
@@ -49,35 +49,35 @@ public class MappingSetup {
         this.mapIfOnlyOneJavadoc = setup.mapIfOnlyOneJavadoc;
     }
 
-    public List getSourceTypes() {
+    public List<String> getSourceTypes() {
         return sourceTypes;
     }
 
-    public void setSourceTypes(List sourceTypes) {
+    public void setSourceTypes(List<String> sourceTypes) {
         this.sourceTypes = sourceTypes;
     }
 
-    public List getJavadocTypes() {
+    public List<String> getJavadocTypes() {
         return javadocTypes;
     }
 
-    public void setJavadocTypes(List javadocTypes) {
+    public void setJavadocTypes(List<String> javadocTypes) {
         this.javadocTypes = javadocTypes;
     }
 
-    public List getSourceSuffixes() {
+    public List<String> getSourceSuffixes() {
         return sourceSuffixes;
     }
 
-    public void setSourceSuffixes(List sourceSuffixes) {
+    public void setSourceSuffixes(List<String> sourceSuffixes) {
         this.sourceSuffixes = sourceSuffixes;
     }
 
-    public List getJavadocSuffixes() {
+    public List<String> getJavadocSuffixes() {
         return javadocSuffixes;
     }
 
-    public void setJavadocSuffixes(List javadocSuffixes) {
+    public void setJavadocSuffixes(List<String> javadocSuffixes) {
         this.javadocSuffixes = javadocSuffixes;
     }
 

Modified: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/internal/eclipse/cpcontainer/IvyClasspathContainerMapper.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/internal/eclipse/cpcontainer/IvyClasspathContainerMapper.java?rev=1587111&r1=1587110&r2=1587111&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/internal/eclipse/cpcontainer/IvyClasspathContainerMapper.java (original)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/internal/eclipse/cpcontainer/IvyClasspathContainerMapper.java Sun Apr 13 22:15:38 2014
@@ -17,6 +17,7 @@
  */
 package org.apache.ivyde.internal.eclipse.cpcontainer;
 
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.MalformedURLException;
@@ -24,7 +25,6 @@ import java.net.URL;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -71,13 +71,11 @@ public class IvyClasspathContainerMapper
 
     private final IJavaProject javaProject;
 
-    private final Collection/* <ArtifactDownloadReport> */all;
+    private final Collection<ArtifactDownloadReport> all;
 
-    private final Map/* <ModuleRevisionId, Artifact[]> */artifactsByDependency;
+    private final Map<ModuleRevisionId, Artifact[]> artifactsByDependency;
 
-    private final Map/*
-                      * <ArtifactDownloadReport , Set<String>>
-                      */retrievedArtifacts;
+    private final Map<ArtifactDownloadReport, Set<String>> retrievedArtifacts;
 
     private ClasspathSetup classpathSetup;
 
@@ -103,15 +101,14 @@ public class IvyClasspathContainerMapper
 
     public IClasspathEntry[] map() {
         IClasspathEntry[] classpathEntries;
-        Collection paths = new LinkedHashSet();
+        Collection<IClasspathEntry> paths = new LinkedHashSet<IClasspathEntry>();
 
         IvyDEMessage.verbose("Building classpath from " + all.size() + " resolved artifact(s)");
 
-        for (Iterator iter = all.iterator(); iter.hasNext();) {
-            ArtifactDownloadReport artifact = (ArtifactDownloadReport) iter.next();
-
+        for (ArtifactDownloadReport artifact : all) {
             if (artifact.getType().equals(WorkspaceResolver.ECLIPSE_PROJECT_TYPE)) {
-                IvyDEMessage.verbose("Found an workspace dependency on project " + artifact.getName());
+                IvyDEMessage.verbose("Found an workspace dependency on project "
+                        + artifact.getName());
                 // This is a java project in the workspace, add project path
                 // but only add it if it is not a self dependency
                 if (javaProject == null
@@ -120,34 +117,42 @@ public class IvyClasspathContainerMapper
                     paths.add(JavaCore.newProjectEntry(new Path(artifact.getName()), rules, true,
                         null, true));
                 } else {
-                    IvyDEMessage.verbose("Skipping self dependency on project " + artifact.getName());
+                    IvyDEMessage.verbose("Skipping self dependency on project "
+                            + artifact.getName());
                 }
             } else if (artifact.getLocalFile() != null && accept(artifact.getArtifact())) {
                 IvyDEMessage.verbose("Adding " + artifact.getName() + " to the classpath");
 
-                IPath classpathArtifact = getArtifactPath(artifact);
-                IPath sourcesArtifact = getArtifactPath(artifact, sourceArtifactMatcher,
-                    mapping.isMapIfOnlyOneSource());
-                IPath javadocArtifact = getArtifactPath(artifact, javadocArtifactMatcher,
-                    mapping.isMapIfOnlyOneJavadoc());
-                IAccessRule[] rules = getAccessRules(classpathArtifact);
-                IPath sources = attachementManager.getSourceAttachment(classpathArtifact,
-                    sourcesArtifact);
-                IPath sourcesRoot = attachementManager.getSourceAttachmentRoot(classpathArtifact,
-                    sourcesArtifact);
-                IClasspathAttribute[] att = getExtraAttribute(classpathArtifact, javadocArtifact);
-
-                if (sources != null) {
-                    IvyDEMessage.debug("Attaching sources " + sources + " to " + classpathArtifact);
-                }
-                if (javadocArtifact != null) {
-                    IvyDEMessage.debug("Attaching javadoc " + javadocArtifact + " to " + classpathArtifact);
-                }
-                if (rules != null) {
-                    IvyDEMessage.debug("Setting OSGi access rules on  " + classpathArtifact);
+                // handle unzipped jar with 'Bundle-Classpath'
+                if (artifact.getLocalFile().isDirectory() && classpathSetup.isReadOSGiMetadata()) {
+                    File manifestFile = new File(artifact.getLocalFile(), "META-INF/MANIFEST.MF");
+                    if (!manifestFile.exists()) {
+                        // no manifest : back to simple classpath
+                        paths.add(buildEntry(artifact, ""));
+                    } else {
+                        try {
+                            BundleInfo bundleInfo = ManifestParser.parseManifest(manifestFile);
+                            if (bundleInfo.hasInnerClasspath()) {
+                                for (String innerPath : bundleInfo.getClasspath()) {
+                                    paths.add(buildEntry(artifact, "/" + innerPath));
+                                }
+                            }
+                        } catch (IOException e) {
+                            IvyDEMessage.error(
+                                "Unreadable MANIFEST.MF for artifact " + artifact.getName() + ": "
+                                        + manifestFile.getAbsolutePath() + " (" + e.getMessage()
+                                        + ")", e);
+                        } catch (ParseException e) {
+                            IvyDEMessage.error(
+                                "Malformed MANIFEST.MF for artifact " + artifact.getName() + ": "
+                                        + manifestFile.getAbsolutePath() + " (" + e.getMessage()
+                                        + ")", e);
+                        }
+                    }
+                } else {
+                    // simple entry
+                    paths.add(buildEntry(artifact, ""));
                 }
-                paths.add(JavaCore.newLibraryEntry(classpathArtifact, sources, sourcesRoot, rules,
-                    att, false));
             }
 
         }
@@ -156,6 +161,30 @@ public class IvyClasspathContainerMapper
         return classpathEntries;
     }
 
+    private IClasspathEntry buildEntry(ArtifactDownloadReport artifact, String innerPath) {
+        IPath classpathArtifact = getArtifactPath(artifact, innerPath);
+        IPath sourcesArtifact = getArtifactPath(artifact, sourceArtifactMatcher,
+            mapping.isMapIfOnlyOneSource(), "");
+        IPath javadocArtifact = getArtifactPath(artifact, javadocArtifactMatcher,
+            mapping.isMapIfOnlyOneJavadoc(), "");
+        IAccessRule[] rules = getAccessRules(classpathArtifact);
+        IPath sources = attachementManager.getSourceAttachment(classpathArtifact, sourcesArtifact);
+        IPath sourcesRoot = attachementManager.getSourceAttachmentRoot(classpathArtifact,
+            sourcesArtifact);
+        IClasspathAttribute[] att = getExtraAttribute(classpathArtifact, javadocArtifact);
+
+        if (sources != null) {
+            IvyDEMessage.debug("Attaching sources " + sources + " to " + classpathArtifact);
+        }
+        if (javadocArtifact != null) {
+            IvyDEMessage.debug("Attaching javadoc " + javadocArtifact + " to " + classpathArtifact);
+        }
+        if (rules != null) {
+            IvyDEMessage.debug("Setting OSGi access rules on  " + classpathArtifact);
+        }
+        return JavaCore.newLibraryEntry(classpathArtifact, sources, sourcesRoot, rules, att, false);
+    }
+
     private IAccessRule[] getAccessRules(IJavaProject javaProject) {
         if (!osgiAvailable || !classpathSetup.isReadOSGiMetadata()) {
             return null;
@@ -194,9 +223,7 @@ public class IvyClasspathContainerMapper
         }
         IAccessRule[] rules = new IAccessRule[bundleInfo.getExports().size() + 1];
         int i = 0;
-        Iterator itExports = bundleInfo.getExports().iterator();
-        while (itExports.hasNext()) {
-            ExportPackage exportPackage = (ExportPackage) itExports.next();
+        for (ExportPackage exportPackage : bundleInfo.getExports()) {
             rules[i++] = JavaCore.newAccessRule(
                 new Path(exportPackage.getName().replace('.', IPath.SEPARATOR) + "/*"),
                 IAccessRule.K_ACCESSIBLE);
@@ -206,14 +233,14 @@ public class IvyClasspathContainerMapper
         return rules;
     }
 
-    private Path getArtifactPath(ArtifactDownloadReport artifact) {
+    private Path getArtifactPath(ArtifactDownloadReport artifact, String innerPath) {
         if (retrievedArtifacts != null) {
-            Set pathSet = (Set) retrievedArtifacts.get(artifact);
+            Set<String> pathSet = retrievedArtifacts.get(artifact);
             if (pathSet != null && !pathSet.isEmpty()) {
-                return new Path((String) pathSet.iterator().next());
+                return new Path((String) pathSet.iterator().next() + innerPath);
             }
         }
-        return new Path(artifact.getLocalFile().getAbsolutePath());
+        return new Path(artifact.getLocalFile().getAbsolutePath() + innerPath);
     }
 
     interface ArtifactMatcher {
@@ -225,16 +252,15 @@ public class IvyClasspathContainerMapper
     }
 
     private Path getArtifactPath(ArtifactDownloadReport adr, ArtifactMatcher matcher,
-            boolean mapIfOnlyOne) {
+            boolean mapIfOnlyOne, String innerPath) {
         Artifact artifact = adr.getArtifact();
         monitor.subTask("searching " + matcher.getName() + " for " + artifact);
-        for (Iterator iter = all.iterator(); iter.hasNext();) {
-            ArtifactDownloadReport otherAdr = (ArtifactDownloadReport) iter.next();
+        for (ArtifactDownloadReport otherAdr : all) {
             Artifact a = otherAdr.getArtifact();
             if (otherAdr.getLocalFile() != null && matcher.matchName(artifact, a.getName())
                     && a.getModuleRevisionId().equals(artifact.getModuleRevisionId())
                     && matcher.match(a)) {
-                return getArtifactPath(otherAdr);
+                return getArtifactPath(otherAdr, innerPath);
             }
         }
         // we haven't found source artifact in resolved artifacts,
@@ -252,7 +278,7 @@ public class IvyClasspathContainerMapper
                         ArtifactDownloadReport metaAdr = ivy.getResolveEngine().download(
                             metaArtifact, new DownloadOptions());
                         if (metaAdr.getLocalFile() != null && metaAdr.getLocalFile().exists()) {
-                            return getArtifactPath(metaAdr);
+                            return getArtifactPath(metaAdr, innerPath);
                         }
                     }
                     // keep a reference to the artifact so we could fall back
@@ -306,8 +332,8 @@ public class IvyClasspathContainerMapper
         }
     };
 
-    private boolean isArtifactName(Artifact artifact, String name,
-            Collection/* <String> */suffixes, String type) {
+    private boolean isArtifactName(Artifact artifact, String name, Collection<String> suffixes,
+            String type) {
         String artifactNameToMatch = (String) artifact.getExtraAttribute(IVYDE_NS_PREFIX + type);
         if (artifactNameToMatch != null) {
             // some name is specified, it overrides suffix matching
@@ -317,9 +343,8 @@ public class IvyClasspathContainerMapper
         if (name.equals(jar)) {
             return true;
         }
-        Iterator it = suffixes.iterator();
-        while (it.hasNext()) {
-            if (name.equals(jar + it.next())) {
+        for (String suffix : suffixes) {
+            if (name.equals(jar + suffix)) {
                 return true;
             }
         }
@@ -327,7 +352,7 @@ public class IvyClasspathContainerMapper
     }
 
     private IClasspathAttribute[] getExtraAttribute(IPath classpathArtifact, IPath javadocArtifact) {
-        List result = new ArrayList();
+        List<IClasspathAttribute> result = new ArrayList<IClasspathAttribute>();
         URL url = attachementManager.getDocAttachment(classpathArtifact);
 
         if (url == null) {
@@ -354,7 +379,7 @@ public class IvyClasspathContainerMapper
             result.add(JavaCore.newClasspathAttribute(
                 IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, url.toExternalForm()));
         }
-        return (IClasspathAttribute[]) result.toArray(new IClasspathAttribute[result.size()]);
+        return result.toArray(new IClasspathAttribute[result.size()]);
     }
 
     /**

Modified: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/internal/eclipse/resolve/ResolveResult.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/internal/eclipse/resolve/ResolveResult.java?rev=1587111&r1=1587110&r2=1587111&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/internal/eclipse/resolve/ResolveResult.java (original)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/internal/eclipse/resolve/ResolveResult.java Sun Apr 13 22:15:38 2014
@@ -37,13 +37,13 @@ public class ResolveResult {
 
     private final boolean previousUsed;
 
-    private Set/* <ArtifactDownloadReport> */artifactReports = new LinkedHashSet();
+    private Set<ArtifactDownloadReport> artifactReports = new LinkedHashSet<ArtifactDownloadReport> ();
 
-    private Set problemMessages = new HashSet();
+    private Set<String> problemMessages = new HashSet<String> ();
 
     private final ResolveReport report;
 
-    private Map/* <ModuleRevisionId, Artifact[]> */artifactsByDependency = new HashMap();
+    private Map<ModuleRevisionId, Artifact[]> artifactsByDependency = new HashMap<ModuleRevisionId, Artifact[]>();
 
     /**
      * Mapping of resolved artifact to their retrieved path, <code>null</code> if there were no
@@ -52,7 +52,7 @@ public class ResolveResult {
      * The paths may be relative It shouldn't be an issue has every relative path should be relative
      * to the eclipse project FIXME: not sure why the Ivy API is returning a set of paths...
      */
-    private Map/* <ArtifactDownloadReport, Set<String>> */retrievedArtifacts;
+    private Map <ArtifactDownloadReport, Set<String>> retrievedArtifacts;
 
     /**
      * Constructor to be used when the resolve have been refreshed
@@ -68,7 +68,7 @@ public class ResolveResult {
     ResolveResult(ResolveReport report) {
         this.report = report;
         previousUsed = false;
-        problemMessages = new HashSet(report.getAllProblemMessages());
+        problemMessages = new HashSet<String>(report.getAllProblemMessages());
     }
 
     /**
@@ -92,7 +92,7 @@ public class ResolveResult {
      * 
      * @return the list of error message
      */
-    public Set/* <String> */getProblemMessages() {
+    public Set<String> getProblemMessages() {
         return problemMessages;
     }
 
@@ -108,7 +108,7 @@ public class ResolveResult {
      * 
      * @return the reports of the artifacts resolved
      */
-    public Set/* <ArtifactDownloadReport> */getArtifactReports() {
+    public Set <ArtifactDownloadReport> getArtifactReports() {
         return artifactReports;
     }
 
@@ -116,11 +116,11 @@ public class ResolveResult {
      * 
      * @return the reports of the artifacts by dependency
      */
-    public Map /* <ModuleRevisionId, Artifact[]> */getArtifactsByDependency() {
+    public Map  <ModuleRevisionId, Artifact[]> getArtifactsByDependency() {
         return artifactsByDependency;
     }
 
-    void setRetrievedArtifacts(Map retrievedArtifacts) {
+    void setRetrievedArtifacts(Map<ArtifactDownloadReport, Set<String>> retrievedArtifacts) {
         this.retrievedArtifacts = retrievedArtifacts;
     }
 
@@ -128,7 +128,7 @@ public class ResolveResult {
      * 
      * @return the path(s) of the retrieved artifacts
      */
-    public Map/* <ArtifactDownloadReport, Set<String>> */getRetrievedArtifacts() {
+    public Map<ArtifactDownloadReport, Set<String>> getRetrievedArtifacts() {
         return retrievedArtifacts;
     }
 }