RemoteUpdateSite.java
001 /*
002  * RemoteUpdateSite.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 java.net.MalformedURLException;
018 import java.net.URI;
019 import java.net.URL;
020 import java.net.URLConnection;
021 import java.util.Collections;
022 import java.util.List;
023 
024 import com.thoughtworks.xstream.XStream;
025 import com.thoughtworks.xstream.converters.SingleValueConverter;
026 import com.thoughtworks.xstream.io.xml.StaxDriver;
027 
028 public class RemoteUpdateSite {
029 
030   protected URI uri;
031 
032   protected String name;
033 
034   protected Boolean enabled = false;
035 
036   protected transient Boolean valid = null;
037 
038   protected transient List<CreolePlugin> plugins = null;
039 
040   public RemoteUpdateSite(String name, URI uri, boolean enabled) {
041     this.name = name;
042     this.uri = uri;
043     this.enabled = enabled;
044   }
045 
046   @SuppressWarnings("unchecked")
047   public List<CreolePlugin> getCreolePlugins() {
048     if(plugins == null) {
049       valid = true;
050       try {
051         XStream xs = new XStream(new StaxDriver());
052         xs.setClassLoader(RemoteUpdateSite.class.getClassLoader());
053         xs.alias("UpdateSite", List.class);
054         xs.alias("CreolePlugin", CreolePlugin.class);
055         xs.useAttributeFor(CreolePlugin.class, "url");
056         xs.useAttributeFor(CreolePlugin.class, "downloadURL");
057         xs.registerConverter(new SingleValueConverter() {
058           @Override
059           public boolean canConvert(@SuppressWarnings("rawtypes"Class type) {
060             return URL.class.isAssignableFrom(type);
061           }
062           
063           @Override
064           public String toString(Object obj) {
065             throw new UnsupportedOperationException("Converting URLs to Strings is not currently supported");
066           }
067           
068           @Override
069           public Object fromString(String value) {
070             try {
071               return new URL(uri.toURL(), value);
072             catch(MalformedURLException e) {
073               throw new RuntimeException("Not a valid URL",e);
074             }
075           }
076         });
077         
078         URLConnection conn = uri.toURL().openConnection();
079         conn.setConnectTimeout(5000);
080         conn.setReadTimeout(5000);
081 
082         plugins = (List<CreolePlugin>)xs.fromXML(conn.getInputStream());
083       catch(Exception e) {
084         e.printStackTrace();
085         valid = false;
086         return Collections.EMPTY_LIST;
087       }
088     else {
089       for(CreolePlugin p : plugins) {
090         p.reset();
091       }
092     }
093 
094     return plugins;
095   }
096 
097   @Override
098   public int hashCode() {
099     final int prime = 31;
100     int result = 1;
101     result = prime * result + ((uri == null: uri.hashCode());
102     return result;
103   }
104 
105   @Override
106   public boolean equals(Object obj) {
107     if(this == objreturn true;
108     if(obj == nullreturn false;
109     if(getClass() != obj.getClass()) return false;
110     RemoteUpdateSite other = (RemoteUpdateSite)obj;
111     if(uri == null) {
112       if(other.uri != nullreturn false;
113     else if(!uri.equals(other.uri)) return false;
114     return true;
115   }
116 }