Revision: 19187
          http://sourceforge.net/p/gate/code/19187
Author:   markagreenwood
Date:     2016-04-03 08:56:16 +0000 (Sun, 03 Apr 2016)
Log Message:
-----------
hackety hack hack hack! this does allow us to load a plugin from maven but it's 
horribly hacky as it has to work around the plugin is a directory issue; that 
idea is next for the chopping block

Modified Paths:
--------------
    gate/branches/sawdust2/ivy.xml
    gate/branches/sawdust2/src/main/gate/Gate.java
    gate/branches/sawdust2/src/main/gate/creole/CreoleAnnotationHandler.java
    gate/branches/sawdust2/src/main/gate/creole/CreoleRegisterImpl.java

Modified: gate/branches/sawdust2/ivy.xml
===================================================================
--- gate/branches/sawdust2/ivy.xml      2016-04-03 01:21:58 UTC (rev 19186)
+++ gate/branches/sawdust2/ivy.xml      2016-04-03 08:56:16 UTC (rev 19187)
@@ -21,6 +21,18 @@
   </configurations>
 
   <dependencies>       
+  
+  <!-- the Aether stuff for dependency resolution - odd to have this in an ivy 
file! -->
+    <dependency org="org.eclipse.aether" name="aether-api" rev="1.1.0" />
+    <dependency org="org.eclipse.aether" name="aether-util" rev="1.1.0" />
+    <dependency org="org.eclipse.aether" name="aether-impl" rev="1.1.0" />
+    <dependency org="org.eclipse.aether" name="aether-connector-basic" 
rev="1.1.0" />
+    <dependency org="org.eclipse.aether" name="aether-transport-file" 
rev="1.1.0" />
+    <dependency org="org.eclipse.aether" name="aether-transport-http" 
rev="1.1.0" />
+    <dependency org="org.eclipse.aether" name="aether-transport-wagon" 
rev="1.1.0" />
+    <dependency org="org.apache.maven" name="maven-aether-provider" 
rev="3.3.9" />
+    <dependency org="org.apache.maven.wagon" name="wagon-ssh" rev="2.10" />
+  
     <!-- things that we repackage under an alternative package name -->
     <dependency org="uk.ac.gate" name="gate-asm" rev="5.0.3" 
conf="required->master" />
     <dependency org="uk.ac.gate" name="gate-compiler-jdt" 
rev="4.3.2-P20140317-1600" conf="required->master" />
@@ -134,6 +146,9 @@
     <exclude org="xml-apis" module="xml-apis" />
     <exclude org="stax" module="stax-api" />
     <exclude org="org.apache.geronimo.specs" 
module="geronimo-stax-api_1.0_spec" />
+    
+    
+    
   </dependencies>
 
 </ivy-module>

Modified: gate/branches/sawdust2/src/main/gate/Gate.java
===================================================================
--- gate/branches/sawdust2/src/main/gate/Gate.java      2016-04-03 01:21:58 UTC 
(rev 19186)
+++ gate/branches/sawdust2/src/main/gate/Gate.java      2016-04-03 08:56:16 UTC 
(rev 19187)
@@ -1228,6 +1228,17 @@
     return dInfo;
   }
   
+  public static DirectoryInfo getDirectoryInfo(URL directory, 
org.jdom.Document creoleDoc) {
+    directory = normaliseCreoleUrl(directory);
+    if(!knownPlugins.contains(directory)) return null;
+    DirectoryInfo dInfo = pluginData.get(directory);
+    if(dInfo == null) {
+      dInfo = new DirectoryInfo(directory, creoleDoc);
+      pluginData.put(directory, dInfo);
+    }
+    return dInfo;
+  }
+  
   /**
    * Returns information about plugin directories which provide the requested
    * resource
@@ -1311,11 +1322,15 @@
     }
     
     public DirectoryInfo(URL url) {
+      this(url, null);
+    }
+    
+    public DirectoryInfo(URL url, org.jdom.Document creoleDoc) {
       this.url = normaliseCreoleUrl(url);
       valid = true;
       resourceInfoList = new ArrayList<ResourceInfo>();
       // this may invalidate it if something goes wrong
-      parseCreole();
+      parseCreole(creoleDoc);
 
       remote = !this.url.getProtocol().equalsIgnoreCase("file");
       
@@ -1362,11 +1377,14 @@
      * Performs a shallow parse of the creole.xml file to get the information
      * about the resources contained.
      */
-    protected void parseCreole() {
-      SAXBuilder builder = new SAXBuilder(false);
+    protected void parseCreole(org.jdom.Document creoleDoc) {
+
       try {
-        URL creoleFileURL = new URL(url, "creole.xml");
-        org.jdom.Document creoleDoc = builder.build(creoleFileURL);
+        if (creoleDoc == null) {
+          SAXBuilder builder = new SAXBuilder(false);
+          URL creoleFileURL = new URL(url, "creole.xml");
+          creoleDoc = builder.build(creoleFileURL);
+        }
 
         final Map<String, ResourceInfo> resInfos = new LinkedHashMap<String, 
ResourceInfo>();
         List<Element> jobsList = new ArrayList<Element>();

Modified: 
gate/branches/sawdust2/src/main/gate/creole/CreoleAnnotationHandler.java
===================================================================
--- gate/branches/sawdust2/src/main/gate/creole/CreoleAnnotationHandler.java    
2016-04-03 01:21:58 UTC (rev 19186)
+++ gate/branches/sawdust2/src/main/gate/creole/CreoleAnnotationHandler.java    
2016-04-03 08:56:16 UTC (rev 19187)
@@ -224,7 +224,7 @@
       throws MalformedURLException {
     Element jdomElt = jdomDoc.getRootElement();
     URL directoryUrl = new URL(creoleFileUrl, ".");
-    DirectoryInfo dirInfo = Gate.getDirectoryInfo(directoryUrl);
+    DirectoryInfo dirInfo = Gate.getDirectoryInfo(directoryUrl,jdomDoc);
     if(dirInfo != null) {
       Map<String, Element> resourceElements = new HashMap<String, Element>();
       findResourceElements(resourceElements, jdomElt);

Modified: gate/branches/sawdust2/src/main/gate/creole/CreoleRegisterImpl.java
===================================================================
--- gate/branches/sawdust2/src/main/gate/creole/CreoleRegisterImpl.java 
2016-04-03 01:21:58 UTC (rev 19186)
+++ gate/branches/sawdust2/src/main/gate/creole/CreoleRegisterImpl.java 
2016-04-03 08:56:16 UTC (rev 19187)
@@ -57,6 +57,27 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.log4j.Logger;
+import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.impl.DefaultServiceLocator;
+import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.ArtifactRequest;
+import org.eclipse.aether.resolution.ArtifactResult;
+import org.eclipse.aether.resolution.DependencyRequest;
+import org.eclipse.aether.resolution.DependencyResult;
+import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
+import org.eclipse.aether.spi.connector.transport.TransporterFactory;
+import org.eclipse.aether.transport.file.FileTransporterFactory;
+import org.eclipse.aether.transport.http.HttpTransporterFactory;
 import org.jdom.Document;
 import org.jdom.Element;
 import org.jdom.JDOMException;
@@ -170,7 +191,126 @@
   public Set<URL> getDirectories() {
     return Collections.unmodifiableSet(directories);
   } // getDirectories
+  
+  public void registerPlugin(String group, String artifact, String version) 
throws Exception {
+    // get the jar file for the coordinates (not dependencies yet)
+    Artifact artifactObj = new DefaultArtifact(group,artifact,"jar",version );
+    
+    Dependency dependency =
+        new Dependency(artifactObj , "all" );
+    RemoteRepository central = new RemoteRepository.Builder( "central", 
"default", "http://repo1.maven.org/maven2/"; ).build();
 
+    ArtifactRequest artifactRequest = new ArtifactRequest();
+    artifactRequest.setArtifact(artifactObj);
+    artifactRequest.addRepository(central);
+    
+    ArtifactResult artifactResult = 
getRepositorySystem().resolveArtifact(getRepositorySession(), artifactRequest);
+    
+    System.out.println(artifactResult.getArtifact().getFile());
+    
+    URL directoryUrl = new 
URL("jar:"+artifactResult.getArtifact().getFile().toURI().toURL()+"!/");    
+    System.out.println(directoryUrl);
+    
+
+    // check it has a creole.xml at the root
+    URL directoryXmlFileUrl = new URL(directoryUrl,"creole.xml");
+    System.out.println(directoryXmlFileUrl);
+    
+    InputStream creoleStream = null;
+
+    try {
+      creoleStream = directoryXmlFileUrl.openStream();
+    }
+    catch(IOException ioe) {
+      throw new IOException(directoryXmlFileUrl.toExternalForm() + " does not 
exist so this artifact is not a GATE plugin");
+    }    
+    
+    CollectRequest collectRequest = new CollectRequest();
+    collectRequest.setRoot( dependency );
+    collectRequest.addRepository( central );
+    DependencyNode node = getRepositorySystem().collectDependencies( 
getRepositorySession(), collectRequest ).getRoot();
+
+    DependencyRequest dependencyRequest = new DependencyRequest();
+    dependencyRequest.setRoot( node );
+
+    DependencyResult result = repoSystem.resolveDependencies( 
getRepositorySession(), dependencyRequest  );
+    
+    // get the creole.xml out of the jar and add jar elements for this
+    // jar (marked for scanning) and the dependencies
+    
+    Document jdomDoc =
+            jdomBuilder.build(creoleStream, 
directoryXmlFileUrl.toExternalForm());
+    
+    Element creoleRoot = jdomDoc.getRootElement();
+    
+    for (ArtifactResult ar : result.getArtifactResults()) {
+      Element jarElement = new Element("JAR");
+      
jarElement.setText(ar.getArtifact().getFile().toURI().toURL().toExternalForm());
      
+      
+      if (ar.getArtifact().equals(artifactResult.getArtifact())) {
+        jarElement.setAttribute("SCAN", "true");
+      }
+      
+      creoleRoot.addContent(jarElement);
+    }
+    
+    XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
+    xmlOut.output(jdomDoc, System.out);
+    
+ // fingers crossed processing then continues as for any other plugin
+      if (!directories.contains(directoryUrl)) {
+        Gate.addKnownPlugin(directoryUrl);
+        
+        try {
+          parseDirectory(jdomDoc, directoryUrl,
+            directoryXmlFileUrl, true);
+          log.info("CREOLE plugin loaded: " + directoryUrl);
+        }
+        catch(Throwable e) {
+          // it failed:
+          throw (new GateException("couldn't open creole.xml",e));
+        }
+        
+        directories.add(directoryUrl);
+        
+        firePluginLoaded(directoryUrl);
+      }
+    
+    
+  }
+  
+  private static RepositorySystem repoSystem = null;
+  
+  private static DefaultRepositorySystemSession repoSystemSession = null;
+  
+  private static RepositorySystem getRepositorySystem() {
+    if(repoSystem != null) return repoSystem;
+
+    DefaultServiceLocator locator =
+            MavenRepositorySystemUtils.newServiceLocator();
+    locator.addService(RepositoryConnectorFactory.class,
+            BasicRepositoryConnectorFactory.class);
+    locator.addService(TransporterFactory.class, FileTransporterFactory.class);
+    locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
+
+    repoSystem = locator.getService(RepositorySystem.class);
+
+    return repoSystem;
+  }
+  
+  private static RepositorySystemSession getRepositorySession() {
+    if(repoSystemSession != null) return repoSystemSession;
+
+    repoSystemSession = MavenRepositorySystemUtils.newSession();
+
+    //LocalRepository localRepo = new LocalRepository("target/local-repo");
+    LocalRepository localRepo = new 
LocalRepository("/home/mark/.m2/repository/");
+    repoSystemSession.setLocalRepositoryManager(getRepositorySystem()
+            .newLocalRepositoryManager(repoSystemSession, localRepo));
+
+    return repoSystemSession;
+  }
+
   @Override
   public void registerComponent(Class<? extends Resource> resourceClass) 
throws GateException {
     URL creoleFileUrl = 
resourceClass.getResource("/gate/creole/CreoleRegisterImpl.class");
@@ -317,18 +457,34 @@
     registerDirectories(directoryUrl, true);    
   }
 
+  protected void parseDirectory(InputStream directoryStream, URL directoryUrl,
+    URL creoleFileUrl, boolean loadDependencies) throws GateException {
+    try {
+      Document jdomDoc =
+              jdomBuilder.build(directoryStream, 
creoleFileUrl.toExternalForm());
+      parseDirectory(jdomDoc, directoryUrl, creoleFileUrl, loadDependencies);
+    }
+    catch (IOException ioe) {
+      throw (new GateException(ioe));
+  }
+  catch(JDOMException je) {
+    if(DEBUG) je.printStackTrace(Err.getPrintWriter());
+    throw (new GateException(je));
+  }
+    
+  }
+  
   /**
    * Parse a directory file (represented as an open stream), adding resource
    * data objects to the CREOLE register as they occur. If the resource is from
    * a URL then that location is passed (otherwise null).
    */
-  protected void parseDirectory(InputStream directoryStream, URL directoryUrl,
+  protected void parseDirectory(Document jdomDoc, URL directoryUrl,
     URL creoleFileUrl, boolean loadDependencies) throws GateException {
     // create a handler for the directory file and parse it;
     // this will create ResourceData entries in the register
     try {
-      Document jdomDoc =
-        jdomBuilder.build(directoryStream, creoleFileUrl.toExternalForm());
+      
       CreoleAnnotationHandler annotationHandler =
         new CreoleAnnotationHandler(creoleFileUrl);
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
GATE-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gate-cvs

Reply via email to