CreolePlugin.java
001 /*
002  * CreolePlugin.java
003  
004  * Copyright (c) 2011, The University of Sheffield. See the file COPYRIGHT.txt
005  * in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006  
007  * This file is part of GATE (see http://gate.ac.uk/), and is free software,
008  * licenced under the GNU Library General Public License, Version 2, June 1991
009  * (in the distribution as file licence.html, and also available at
010  * http://gate.ac.uk/gate/licence.html).
011  
012  * Mark A. Greenwood, 29/10/2011
013  */
014 
015 package gate.gui.creole.manager;
016 
017 import gate.Gate;
018 import gate.Main;
019 import gate.util.VersionComparator;
020 
021 import java.io.File;
022 import java.net.URL;
023 import java.net.URLConnection;
024 
025 import org.jdom.Element;
026 import org.jdom.input.SAXBuilder;
027 
028 public class CreolePlugin {
029 
030   protected String id, description, gateMin, gateMax;
031 
032   protected URL downloadURL, url, helpURL;
033 
034   protected String version;
035 
036   private transient String name;
037 
038   protected transient String installed;
039 
040   protected transient File dir;
041 
042   protected transient boolean compatible;
043 
044   protected transient boolean install = false;
045 
046   public URL getHelpURL() {
047     return helpURL;
048   }
049   
050   protected void reset() {
051     dir = null;
052     install = false;
053   }
054 
055   private Object readResolve() {
056     if(url != null) {
057       url = Gate.normaliseCreoleUrl(url);
058       try {
059         CreolePlugin p = load(new URL(url, "creole.xml"));
060         if (downloadURL != nullp.downloadURL = downloadURL;
061         return p;
062       catch(Exception e) {
063         throw new RuntimeException(e);
064       }
065     else {
066       throw new RuntimeException("CREOLE Directory URL Must Be Specified!");
067     }
068   }
069 
070   @Override
071   public int hashCode() {
072     final int prime = 31;
073     int result = 1;
074     result = prime * result + ((id == null: id.hashCode());
075     return result;
076   }
077 
078   @Override
079   public boolean equals(Object obj) {
080     if(this == objreturn true;
081     if(obj == nullreturn false;
082     if(getClass() != obj.getClass()) return false;
083     CreolePlugin other = (CreolePlugin)obj;
084     if(id == null) {
085       if(other.id != nullreturn false;
086     else if(!id.equals(other.id)) return false;
087     return true;
088   }
089 
090   public static CreolePlugin load(URL creoleURLthrows Exception {
091     SAXBuilder builder = new SAXBuilder(false);
092 
093     URLConnection conn = creoleURL.openConnection();
094     conn.setReadTimeout(5000);
095     conn.setConnectTimeout(5000);
096 
097     org.jdom.Document creoleDoc = builder.build(conn.getInputStream());
098 
099     Element root = creoleDoc.getRootElement();
100 
101     String name = root.getAttributeValue("ID");
102     String version = root.getAttributeValue("VERSION");
103     String desc = root.getAttributeValue("DESCRIPTION");
104     String gateMin = root.getAttributeValue("GATE-MIN");
105     String gateMax = root.getAttributeValue("GATE-MAX");
106     String help = root.getAttributeValue("HELPURL");
107 
108     URL helpURL = null;
109     try {
110       helpURL = new URL(creoleURL, help);
111     }
112     catch (Exception e) {
113       //ignore all exceptions and just use null;
114     }
115     
116     if(name == null || version == nullreturn null;
117 
118     return new CreolePlugin(name, version, new URL(
119             creoleURL, "creole.zip"), desc, helpURL, gateMin, gateMax);
120   }
121 
122   public String getName() {
123     if(name == null) {
124       name = id.substring(id.lastIndexOf('.'1);
125     }
126 
127     return name;
128   }
129 
130   public CreolePlugin(String id, String version, URL downloadURL, 
131           String description, URL helpURL, String gateMin, String gateMax) {
132     this.id = id;
133     this.version = version;
134     this.downloadURL = downloadURL;
135     this.description = description;
136     this.gateMin = gateMin;
137     this.gateMax = gateMax;
138     this.helpURL = helpURL;
139 
140     compatible = VersionComparator.isCompatible(this.gateMin, this.gateMax);
141   }
142 
143   @Override
144   public String toString() {
145     return getName() " v" + version;
146   }
147 
148   public String compatabilityInfo() {
149     if(compatiblereturn "";
150 
151     if(gateMin == null || VersionComparator.isGATENewEnough(gateMin))
152       return " <i>(Discontinued after GATE " + gateMax + ")</i>";
153 
154     if(gateMax == null
155             || VersionComparator.compareVersions(Main.version, gateMax<= 0)
156       return " <i>(Requires GATE " + gateMin + " or above)</i>";
157 
158     // we should never get to here but just in case...
159     return " <i>(Requires GATE " + gateMin + " to " + gateMax + ")</i>";
160   }
161 }