00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 package org.knopflerfish.framework;
00036
00037 import java.net.*;
00038 import org.osgi.service.url.*;
00039 import java.util.Map;
00040 import java.util.HashMap;
00041 import org.osgi.framework.*;
00042
00047 public class ServiceContentHandlerFactory
00048 implements ContentHandlerFactory
00049 {
00050 Framework framework;
00051
00052
00053 String[] jvmPkgs = null;
00054
00055
00056 Map wrapMap = new HashMap();
00057
00058 ServiceContentHandlerFactory(Framework fw) {
00059 this.framework = fw;
00060
00061
00062 String s = System.getProperty("java.content.handler.pkgs", "");
00063
00064 jvmPkgs = Util.splitwords(s, "|");
00065 for(int i = 0; i < jvmPkgs.length; i++) {
00066 jvmPkgs[i] = jvmPkgs[i].trim();
00067 if(Debug.url) {
00068 Debug.println("JVMClassPathCH - jvmPkgs[" + i + "]=" + jvmPkgs[i]);
00069 }
00070 }
00071 }
00072
00073 public ContentHandler createContentHandler(String mimetype) {
00074
00075 if(Debug.url) {
00076 Debug.println("createContentHandler protocol=" + mimetype);
00077 }
00078
00079 ContentHandler handler = getJVMClassPathHandler(mimetype);
00080
00081 if(handler != null) {
00082 if(Debug.url) {
00083 Debug.println("using JVMClassPath handler for " + mimetype);
00084 }
00085 return handler;
00086 }
00087
00088
00089 handler = getServiceHandler(mimetype);
00090
00091 if(handler != null) {
00092 if(Debug.url) {
00093 Debug.println("Using service ContentHandler for " + mimetype + ", handler=" + handler);
00094 }
00095 return handler;
00096 }
00097
00098 if(Debug.url) {
00099 Debug.println("Using default ContentHandler for " + mimetype);
00100 }
00101
00102
00103 return null;
00104 }
00105
00106 ContentHandler getServiceHandler(String mimetype) {
00107 try {
00108 String filter = "(" + URLConstants.URL_CONTENT_MIMETYPE + "=" + mimetype + ")";
00109
00110 ServiceReference[] srl = framework.services
00111 .get(ContentHandler.class.getName(), filter, null, false);
00112
00113 if(srl != null && srl.length > 0) {
00114 ContentHandlerWrapper wrapper =
00115 (ContentHandlerWrapper)wrapMap.get(mimetype);
00116
00117 if(wrapper == null) {
00118 wrapper = new ContentHandlerWrapper(framework, mimetype);
00119 wrapMap.put(mimetype, wrapper);
00120 }
00121 return wrapper;
00122 }
00123 } catch (InvalidSyntaxException e) {
00124 throw new RuntimeException("Failed to get service: " + e);
00125 }
00126
00127 return null;
00128 }
00129
00130
00131
00132 ContentHandler getJVMClassPathHandler(String mimetype) {
00133 for(int i = 0; i < jvmPkgs.length; i++) {
00134 String converted = convertMimetype(mimetype);
00135
00136 String className = jvmPkgs[i] + "." + converted + ".Handler";
00137 try {
00138 if(Debug.url) {
00139 Debug.println("JVMClassPathCH - trying ContentHandler class=" + className);
00140 }
00141 Class clazz = Class.forName(className);
00142 ContentHandler handler = (ContentHandler)clazz.newInstance();
00143
00144 if(Debug.url) {
00145 Debug.println("JVMClassPathCH - created ContentHandler class=" + className);
00146 }
00147
00148 return handler;
00149 } catch (Throwable t) {
00150 if(Debug.url) {
00151 Debug.println("JVMClassPathCH - no ContentHandler class " + className);
00152 }
00153 }
00154 }
00155
00156 if(Debug.url) {
00157 Debug.println("JVMClassPath - no ContentHandler for " + mimetype);
00158 }
00159
00160 return null;
00161 }
00162
00163
00164 static String convertMimetype(String s) {
00165
00166 String bad = ".,:;*-";
00167 for(int i = 0; i < bad.length(); i++) {
00168 s = s.replace(bad.charAt(i), '_');
00169 }
00170
00171 s = s.replace('/', '.');
00172
00173 return s;
00174 }
00175 }
00176