KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > applications > packaging > ProviderManager


1 /*
2  
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5  
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8  
9  */

10
11 package org.mmbase.applications.packaging;
12
13 import java.io.BufferedInputStream JavaDoc;
14 import java.io.File JavaDoc;
15 import java.net.HttpURLConnection JavaDoc;
16 import java.net.URL JavaDoc;
17 import java.util.HashMap JavaDoc;
18 import java.util.Iterator JavaDoc;
19
20 import org.mmbase.applications.packaging.providerhandlers.DiskProvider;
21 import org.mmbase.applications.packaging.providerhandlers.HttpProvider;
22 import org.mmbase.applications.packaging.providerhandlers.PackageDiscovery;
23 import org.mmbase.applications.packaging.providerhandlers.ProviderFileWriter;
24 import org.mmbase.applications.packaging.providerhandlers.ProviderInterface;
25 import org.mmbase.applications.packaging.util.ExtendedDocumentReader;
26 import org.mmbase.util.XMLEntityResolver;
27 import org.mmbase.util.logging.Logger;
28 import org.mmbase.util.logging.Logging;
29 import org.w3c.dom.Element JavaDoc;
30 import org.w3c.dom.NamedNodeMap JavaDoc;
31 import org.xml.sax.InputSource JavaDoc;
32
33 /**
34  * provider manager, maintains the package/bundles providers and abstracts
35  * their access methods for the Bundle and Package manager.
36  *
37  * @author Daniel Ockeloen (MMBased)
38  */

39 public class ProviderManager {
40     private static Logger log = Logging.getLoggerInstance(ProviderManager.class);
41     private static boolean state = false;
42     private static PackageDiscovery packagediscovery = null;
43     
44     // Contains all providers key=provider value=reference to provider
45
private static HashMap JavaDoc providers = null;
46
47     // Contains all providerhandlers
48
private static HashMap JavaDoc providerhandlers = null;
49
50
51     /** DTD resource filename of the providerhandlers DTD version 1.0 */
52     public static final String JavaDoc DTD_PROVIDERHANDLERS_1_0 = "providerhandlers_1_0.dtd";
53     public static final String JavaDoc DTD_PROVIDERS_1_0 = "providers_1_0.dtd";
54     public static final String JavaDoc DTD_SHAREAUTOCONFIG_1_0 = "shareautoconfig_1_0.dtd";
55
56     public static final String JavaDoc PUBLIC_ID_PROVIDERHANDLERS_1_0 = "-//MMBase//DTD providerhandlers config 1.0//EN";
57     public static final String JavaDoc PUBLIC_ID_PROVIDERS_1_0 = "-//MMBase//DTD providers config 1.0//EN";
58     public static final String JavaDoc PUBLIC_ID_SHAREAUTOCONFIG_1_0 = "-//MMBase//DTD shareautoconfig 1.0//EN";
59
60     /**
61      * Register the Public Ids for DTDs used by DatabaseReader
62      * This method is called by XMLEntityResolver.
63      */

64     public static void registerPublicIDs() {
65         XMLEntityResolver.registerPublicID(PUBLIC_ID_PROVIDERHANDLERS_1_0, DTD_PROVIDERHANDLERS_1_0, ProviderManager.class);
66         XMLEntityResolver.registerPublicID(PUBLIC_ID_PROVIDERS_1_0, DTD_PROVIDERS_1_0, ProviderManager.class);
67         XMLEntityResolver.registerPublicID(PUBLIC_ID_SHAREAUTOCONFIG_1_0, DTD_SHAREAUTOCONFIG_1_0, ProviderManager.class);
68     }
69
70
71     public static synchronized void init() {
72         if (!isRunning()) {
73             readProviderHandlers();
74             readProviders();
75             packagediscovery = new PackageDiscovery();
76             state=true;
77         }
78     }
79
80     public static boolean isRunning() {
81         return state;
82     }
83
84     /**
85      * return all packages based on the input query
86      * @return all packages
87      */

88     public static Iterator JavaDoc getProviders() {
89         if (providers == null) init();
90         return providers.values().iterator();
91     }
92
93
94     /**
95      * return all packages based on the input query
96      * @return all packages
97      */

98     public static ProviderInterface getProvider(String JavaDoc name) {
99         if (providers == null) init();
100     Object JavaDoc o = providers.get(name);
101     if (o != null) {
102         return (ProviderInterface)o;
103     } else {
104         return null;
105     }
106     }
107
108     public static void resetSleepCounter() {
109         packagediscovery.resetSleepCounter();
110     }
111
112
113
114
115     /**
116      * return all packages based on the input query
117      * @return all packages
118      */

119     public static ProviderInterface get(String JavaDoc name) {
120         if (providers == null) init();
121         Object JavaDoc o = providers.get(name);
122         if (o != null) {
123             return (ProviderInterface)o;
124         } else {
125             log.error("Can't find provider with name : "+name);
126             return null;
127         }
128     }
129
130
131     public static boolean delete(String JavaDoc name) {
132         if (providers == null) init();
133         Object JavaDoc o = providers.get(name);
134         if (o != null) {
135             // close provider for new incomming packages
136
((ProviderInterface)o).close();
137
138             // small trick set provider time check to now
139
// so all packages it has seem expired
140
((ProviderInterface)o).signalUpdate();
141
142             // remove all the offline packages from this provider
143
PackageManager.removeOfflinePackages((ProviderInterface)o);
144
145             // remove all the offline bundle from this provider
146
BundleManager.removeOfflineBundles((ProviderInterface)o);
147
148             // remove the provider itself.
149
providers.remove(name);
150             return true;
151         } else {
152             return false;
153         }
154     }
155
156     public static void readProviders() {
157         providers = new HashMap JavaDoc();
158         String JavaDoc filename = PackageManager.getConfigPath()+File.separator+"packaging"+File.separator+"providers.xml";
159
160         File JavaDoc file = new File JavaDoc(filename);
161         if(file.exists()) {
162             ExtendedDocumentReader reader = new ExtendedDocumentReader(filename,ProviderManager.class);
163             if(reader != null) {
164                 for(Iterator JavaDoc ns = reader.getChildElements("providers","provider");ns.hasNext(); ) {
165                     Element JavaDoc n = (Element JavaDoc)ns.next();
166                     NamedNodeMap JavaDoc nm = n.getAttributes();
167                     if (nm != null) {
168                         String JavaDoc name = null;
169                         String JavaDoc method = null;
170                         String JavaDoc maintainer = null;
171
172                         // decode name
173
org.w3c.dom.Node JavaDoc n2 = nm.getNamedItem("name");
174                         if (n2 != null) {
175                             name = n2.getNodeValue();
176                         }
177
178                         // decode the method
179
n2 = nm.getNamedItem("method");
180                         if (n2 != null) {
181                             method = n2.getNodeValue();
182                         }
183
184                         // decode the maintainer
185
n2 = nm.getNamedItem("maintainer");
186                         if (n2 != null) {
187                             maintainer = n2.getNodeValue();
188                         }
189
190                         if (method != null) {
191                             // try to create this handler
192
String JavaDoc classname = (String JavaDoc)providerhandlers.get(method);
193                             if (classname != null) {
194                                 try {
195                                     Class JavaDoc newclass = Class.forName(classname);
196                                     ProviderInterface newprovider = (ProviderInterface)newclass.newInstance();
197                                     newprovider.init(n,name,method,maintainer);
198                                     providers.put(name,newprovider);
199                                 } catch(Exception JavaDoc e) {
200                                     e.printStackTrace();
201                                 }
202                             }
203                         }
204                     }
205                 }
206             }
207         } else {
208             log.error("missing package providers file : "+filename);
209         }
210     }
211
212
213     public static boolean writeProviderFile() {
214         ProviderFileWriter.write();
215         return true;
216     }
217   
218     // should be moved to the correct class
219
public static String JavaDoc addDiskProvider(String JavaDoc name,String JavaDoc path) {
220         if (get(name) == null) {
221             DiskProvider d = new DiskProvider();
222             d.init(name,"disk","local",path);
223             providers.put(name,d);
224         } else {
225             String JavaDoc feedback = " '"+name+"' allready in your providers list !";
226             return feedback;
227         }
228         String JavaDoc feedback = " '"+name+"' added, see overview for details";
229         return feedback;
230     }
231
232     // should be moved to the corrent class
233
public static String JavaDoc addSubscribeProvider(String JavaDoc url) {
234         ExtendedDocumentReader reader = getAutoConfigReader(url);
235         // lets hunt for the file, should be a little nicer
236
if (reader == null) reader = getAutoConfigReader(url+"/mmbase/packagemanager/shareautoconfig.jsp");
237         if (reader == null) reader = getAutoConfigReader(url+"/mmbase-webapp/mmbase/packagemanager/shareautoconfig.jsp");
238         if (reader == null) reader = getAutoConfigReader(url+"/shareautoconfig.jsp");
239         if (reader == null) reader = getAutoConfigReader(url+"/mmbase-webapp/shareautoconfig.jsp");
240         if (reader != null) {
241             String JavaDoc name = "unknown";
242             String JavaDoc method = "unknown";
243             String JavaDoc maintainer = "unknown";
244             String JavaDoc account = "guest";
245             String JavaDoc password = "guest";
246             String JavaDoc path = "";
247             for(Iterator JavaDoc ns = reader.getChildElements("shareautoconfig");ns.hasNext(); ) {
248                 Element JavaDoc e = (Element JavaDoc)ns.next();
249                 String JavaDoc field = e.getNodeName();
250                 org.w3c.dom.Node JavaDoc n = e.getFirstChild();
251                 if (field.equals("name")) name = n.getNodeValue();
252                 if (field.equals("method")) method = n.getNodeValue();
253                 if (field.equals("maintainer")) maintainer = n.getNodeValue();
254                 if (field.equals("account")) account = n.getNodeValue();
255                 if (field.equals("password")) password = n.getNodeValue();
256                 if (field.equals("path")) path = n.getNodeValue();
257             }
258             if (method.equals("http")) {
259                 if (get(name) == null) {
260                     ProviderInterface h = new HttpProvider();
261                     h.setAccount(account);
262                     h.setPassword(password);
263                     h.init(name,method,maintainer,path);
264                     providers.put(name,h);
265                 } else {
266                     String JavaDoc feedback = " '"+name+"' allready in your providers list !";
267                     return feedback;
268                 }
269                 String JavaDoc feedback = " '"+name+"' added, see overview for details";
270                 return feedback;
271             }
272         }
273         String JavaDoc feedback = "unable to find share autoconfig file at that location";
274         return feedback;
275     }
276
277     // should be moved to the correct class
278
private static ExtendedDocumentReader getAutoConfigReader(String JavaDoc url) {
279         ExtendedDocumentReader reader = null;
280         try {
281             if (url.indexOf("http://") != 0) url = "http://"+url;
282             URL JavaDoc includeURL = new URL JavaDoc(url);
283             HttpURLConnection JavaDoc connection = (HttpURLConnection JavaDoc) includeURL.openConnection();
284             BufferedInputStream JavaDoc input = new BufferedInputStream JavaDoc(connection.getInputStream());
285             reader = new ExtendedDocumentReader(new InputSource JavaDoc(input),ProviderManager.class);
286             return reader;
287         } catch(Exception JavaDoc e) {
288             return null;
289         }
290     }
291
292
293     public static void readProviderHandlers() {
294        providerhandlers = new HashMap JavaDoc();
295        String JavaDoc filename = PackageManager.getConfigPath()+File.separator+"packaging"+File.separator+"providerhandlers.xml";
296
297         File JavaDoc file = new File JavaDoc(filename);
298         if(file.exists()) {
299             ExtendedDocumentReader reader = new ExtendedDocumentReader(filename,ProviderManager.class);
300             if(reader != null) {
301                 for(Iterator JavaDoc ns = reader.getChildElements("providerhandlers","providerhandler");ns.hasNext(); ) {
302                     Element JavaDoc n = (Element JavaDoc)ns.next();
303                     NamedNodeMap JavaDoc nm = n.getAttributes();
304                     if (nm != null) {
305                         String JavaDoc method = null;
306                         String JavaDoc classname = null;
307                         String JavaDoc state = null;
308                         String JavaDoc basescore = null;
309
310                         // decode method
311
org.w3c.dom.Node JavaDoc n2 = nm.getNamedItem("method");
312                         if (n2 != null) {
313                             method = n2.getNodeValue();
314                         }
315
316                         // decode the state
317
n2 = nm.getNamedItem("state");
318                         if (n2 != null) {
319                             state = n2.getNodeValue();
320                         }
321
322                         // decode the basescore
323
n2 = nm.getNamedItem("basescore");
324                         if (n2 != null) {
325                             basescore = n2.getNodeValue();
326                         }
327
328                         // decode the class
329
n2 = nm.getNamedItem("class");
330                         if (n2 != null) {
331                             classname = n2.getNodeValue();
332                         }
333                         providerhandlers.put(method,classname);
334                     }
335                 }
336             }
337         } else {
338             log.error("missing providerhandler file : "+filename);
339         }
340     }
341
342     public static HashMap JavaDoc getProviderHandlers() {
343         return providerhandlers;
344     }
345
346     public static void discoverPackages() {
347     packagediscovery.getPackages();
348     }
349     
350 }
351
Popular Tags