Changeset 3977

Show
Ignore:
Timestamp:
07/10/08 08:12:03 (3 years ago)
Author:
michael
Message:

Better OSGi support

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/build.xml

    r3966 r3977  
    4242                        </fileset> 
    4343                </jar> 
    44         <ivy:retrieve pattern="${build.dir}/main/osgi/[artifact]-[revision].[ext]" conf="osgi" useOrigin="true" /> 
     44        <ivy:retrieve pattern="${build.dir}/main/osgi/[artifact]-[revision].[ext]" conf="lib" useOrigin="true" /> 
    4545        <jar destfile="${dist.dir}/${project.name}-osgi-${build.rev}.jar" filesetmanifest="merge"> 
    4646            <fileset dir="${build.dir}/main/java" /> 
  • trunk/ivy.xml

    r3966 r3977  
    55  <configurations> 
    66    <conf name="default" description="Runtime configuration"/> 
     7    <conf name="osgi" description="OSGi Bundle version"/> 
    78    <conf name="restlet" description="XTC-Restlet integration" extends="default"/> 
    89    <conf name="fop" description="Apache FOP integration" extends="restlet"/> 
    9     <conf name="osgi" description="OSGi Bundle version"/> 
     10    <conf name="lib" visibility="private" extends="osgi"/> 
    1011    <conf name="compile" visibility="private" extends="default,restlet,fop"/> 
    1112    <conf name="test" visibility="private" extends="compile"/> 
     
    1819  </publications> 
    1920  <dependencies> 
    20     <dependency org="de.odysseus.juel" name="juel" rev="2.1.0" conf="default,osgi->default"/> 
    21     <dependency org="org.restlet" name="org.restlet" rev="1.1-RC1" conf="restlet,compile->default"/> 
     21    <dependency org="de.odysseus.juel" name="juel" rev="2.1.0" conf="default,lib->default"/> 
     22    <dependency org="org.restlet" name="org.restlet" rev="1.1-RC1" conf="restlet->default"/> 
    2223    <dependency org="com.noelios.restlet" name="com.noelios.restlet.ext.jetty" rev="1.1-RC1" conf="compile->default"/> 
    2324    <dependency org="javax.servlet" name="servlet-api" rev="2.5" conf="compile->default" /> 
  • trunk/src/main/java/org/sarugo/xtc/Resolver.java

    r3966 r3977  
    1515import java.util.jar.JarEntry; 
    1616import java.util.jar.JarFile; 
     17import java.util.logging.Logger; 
    1718 
    1819/** 
     
    2425 */ 
    2526public class Resolver { 
     27         
     28        protected static final Logger log = Logger.getLogger("xtc.resolver"); 
    2629 
    2730        private ClassLoader userClassLoader; 
     
    9598        } 
    9699 
    97         protected URL localise(URL url) { 
    98                 return url; 
    99         } 
    100  
    101100        private void search(Collection<URL> results, ClassLoader cl, String prefix, 
    102101                        String suffix) throws IOException { 
     
    106105                JarFile jarFile; 
    107106                while (e.hasMoreElements()) { 
    108                         url = localise((URL) e.nextElement()); 
     107                        url = e.nextElement(); 
    109108                        conn = url.openConnection(); 
    110109                        conn.setUseCaches(false); 
  • trunk/src/main/java/org/sarugo/xtc/osgi/Activator.java

    r3966 r3977  
    77public class Activator implements BundleActivator { 
    88 
     9        private OsgiResolver resolver; 
     10 
    911        public void start(BundleContext context) throws Exception { 
    10                 TemplateFactory.setResolver(new OsgiResolver()); 
     12                resolver = new OsgiResolver(); 
     13                resolver.addBundle(context.getBundle()); 
     14                TemplateFactory.setResolver(resolver); 
    1115        } 
    1216 
    1317        public void stop(BundleContext context) throws Exception { 
     18                resolver.removeBundle(context.getBundle()); 
    1419        } 
    1520 
  • trunk/src/main/java/org/sarugo/xtc/osgi/OsgiResolver.java

    r3966 r3977  
    22 
    33import java.io.IOException; 
     4import java.io.InputStream; 
    45import java.net.URL; 
    5 import java.net.URLConnection; 
     6import java.util.ArrayList; 
     7import java.util.Collection; 
     8import java.util.Collections; 
     9import java.util.Enumeration; 
     10import java.util.List; 
    611 
    7 import org.eclipse.osgi.framework.internal.core.BundleURLConnection
     12import org.osgi.framework.Bundle
    813import org.sarugo.xtc.Resolver; 
    914 
    1015public class OsgiResolver extends Resolver { 
    1116 
     17        private final List<Bundle> bundles; 
     18 
     19        public OsgiResolver() { 
     20                this.bundles = Collections.synchronizedList(new ArrayList<Bundle>()); 
     21        } 
     22 
    1223        @Override 
    13         protected URL localise(URL url) { 
    14                 if (url.getProtocol().startsWith("bundle")) { 
    15                         URLConnection conn; 
     24        public URL getResource(String name) { 
     25                URL url = getResourceFromActiveBundles(name); 
     26                if (url == null) { 
     27                        url = super.getResource(name); 
     28                } 
     29                return url; 
     30        } 
     31 
     32        @Override 
     33        public InputStream getResourceAsStream(String name) { 
     34                URL url = getResourceFromActiveBundles(name); 
     35                InputStream is = null; 
     36                if (url != null) { 
    1637                        try { 
    17                                 conn = url.openConnection(); 
    18                                 if (conn instanceof BundleURLConnection) { 
    19                                         url = ((BundleURLConnection) conn).getLocalURL(); 
     38                                is = url.openStream(); 
     39                        } catch (IOException e) { 
     40                                log.warning("Error opening resource as a stream from URL: " 
     41                                                + url); 
     42                        } 
     43                } else { 
     44                        is = super.getResourceAsStream(name); 
     45                } 
     46                return is; 
     47        } 
     48 
     49        @Override 
     50        public Class<?> loadClass(String name) throws ClassNotFoundException { 
     51                Class<?> clazz = super.loadClass(name); 
     52                if (clazz == null) { 
     53                        synchronized (bundles) { 
     54                                for (Bundle b : bundles) { 
     55                                        // skip inactive bundles 
     56                                        if ((b.getState() & Bundle.ACTIVE) == 0) 
     57                                                continue; 
     58                                        clazz = b.loadClass(name); 
     59                                        if (clazz != null) 
     60                                                break; 
    2061                                } 
    21                         } catch (IOException e) { 
    22                                 e.printStackTrace(); 
     62                        } 
     63                } 
     64                return clazz; 
     65        } 
     66 
     67        @SuppressWarnings("unchecked") 
     68        @Override 
     69        public Collection<URL> search(String prefix, String suffix) 
     70                        throws IOException { 
     71                Collection<URL> results = super.search(prefix, suffix); 
     72                synchronized (bundles) { 
     73                        for (Bundle b : bundles) { 
     74                                // skip inactive bundles 
     75                                if ((b.getState() & Bundle.ACTIVE) == 0) 
     76                                        continue; 
     77                                for (Enumeration<String> e = b.getEntryPaths(prefix); e 
     78                                                .hasMoreElements();) { 
     79                                        String path = e.nextElement(); 
     80                                        if (path.endsWith(suffix)) { 
     81                                                results.add(b.getEntry(path)); 
     82                                        } 
     83                                } 
     84                        } 
     85                } 
     86                return results; 
     87        } 
     88 
     89        private URL getResourceFromActiveBundles(String name) { 
     90                URL url = null; 
     91                synchronized (bundles) { 
     92                        for (Bundle b : bundles) { 
     93                                // skip inactive bundles 
     94                                if ((b.getState() & Bundle.ACTIVE) == 0) 
     95                                        continue; 
     96                                url = b.getEntry(name); 
     97                                if (url != null) 
     98                                        break; 
    2399                        } 
    24100                } 
    25101                return url; 
    26102        } 
     103         
     104        public void addBundle(Bundle b) { 
     105                bundles.add(b); 
     106        } 
     107         
     108        public void removeBundle(Bundle b) { 
     109                bundles.remove(b); 
     110        } 
    27111 
    28112} 
  • trunk/src/main/resources/META-INF/MANIFEST.MF

    r3966 r3977  
    2020 org.sarugo.xtc.restlet, 
    2121 org.sarugo.xtc.tag, 
     22 org.sarugo.xtc.osgi, 
    2223 javax.el 
    2324Bundle-Activator: org.sarugo.xtc.osgi.Activator