Changeset 7481 for RevitalizationWS


Ignore:
Timestamp:
20/09/10 12:08:42 (9 years ago)
Author:
mnagni
Message:

Improved the ObjectFactory? collection

File:
1 edited

Legend:

Unmodified
Added
Removed
  • RevitalizationWS/common/core/trunk/src/main/java/ndg/common/jaxb/JAXBManager.java

    r7464 r7481  
    1919import java.lang.reflect.InvocationTargetException; 
    2020import java.lang.reflect.Method; 
     21import java.net.MalformedURLException; 
    2122import java.net.URISyntaxException; 
    2223import java.net.URL; 
    2324import java.net.URLClassLoader; 
    2425import java.util.ArrayList; 
    25 import java.util.Arrays; 
    2626import java.util.Enumeration; 
     27import java.util.HashSet; 
    2728import java.util.List; 
     29import java.util.Set; 
    2830import java.util.WeakHashMap; 
    2931import java.util.jar.JarEntry; 
     
    3941import ndg.common.exception.ResourceNotAvailable; 
    4042 
    41 /**  
    42  * Manages marshal and unmarshal for a set of JAXB generated classes. This class uses different 
    43  * strategies: 
     43/** 
     44 * Manages marshal and unmarshal for a set of JAXB generated classes. This class 
     45 * uses different strategies: 
    4446 * <ul> 
    4547 * <li> 
    46  *      loads the jar in an internal <code>URLClassLoader</code> instance. In this way both each JAXBManager  
    47  *  instance manages a different subset of jars and can load dynamically the jars  
    48  * </li> 
     48 * loads the jar in an internal <code>URLClassLoader</code> instance. In this 
     49 * way each JAXBManager instance manages a different subset of jars and at the same time could 
     50 * load dynamically load the jars (feature still not activated)</li> 
    4951 * <li> 
    50  *      Manages an internal cache, based on <code>WeakHashMap</code> instances, to minimize both the memory impact 
    51  * and the access to the classes underlying the marshaller/unmarshaller execution. 
    52  * </li>  
     52 * Manages an internal cache, based on <code>WeakHashMap</code> instances, to 
     53 * minimize both the memory impact and the access to the classes underlying the 
     54 * marshaller/unmarshaller execution.</li> 
    5355 * </ul> 
    54  * @author Maurizio Nagni <maurizio.nagni@stfc.ac.uk>    
     56 *  
     57 * @author Maurizio Nagni <maurizio.nagni@stfc.ac.uk> 
    5558 */ 
    5659public class JAXBManager { 
    5760 
     61        private final List<URL> urls = new ArrayList<URL>(); 
     62        private final Set<String> factories = new HashSet<String>(); 
     63 
    5864        private URLClassLoader urlLoader = null; 
    59         private final List<URL> urls = new ArrayList<URL>(); 
    6065        private JAXBContext jc = null; 
    6166        private WeakHashMap<String, Method> creator = new WeakHashMap<String, Method>(); 
     
    6469        private Unmarshaller unmarshaller = null; 
    6570 
    66          
    67         /** 
    68          * Creates an instance using the jars referred by the parameter. 
    69          * @param jarNames a collection of <code>URL</code>s representing the path to the jar files 
     71        /** 
     72         * Creates an instance of the JAXBManager. The parameters cannot be both <code>null</code>  
     73         * at the same time. 
     74         *  
     75         * @param urls 
     76         *            a collection of <code>URL</code>s representing the path to the 
     77         *            jar files. If <code>null</code> retrieves the jars in the classpath 
     78         * @param factories a collections of the packages names used as filter to accept the JAXB 
     79         * ObjectFactories   
     80         * @throws ResourceNotAvailable both the parameters are null or other 
     81         * @throws JAXBException general JAXB exception            
    7082         **/ 
    71         public JAXBManager(List<URL> urls) throws ResourceNotAvailable, JAXBException { 
     83        public JAXBManager(List<URL> urls, Set<String> factories) throws ResourceNotAvailable, JAXBException { 
    7284                super(); 
     85                if ((urls == null || urls.size() == 0) && (factories == null || factories.size() == 0)) 
     86                        throw new ResourceNotAvailable("Both the constructor's parameters canno be null"); 
     87                urls = urls == null ? useClasspath() : urls; 
    7388                this.urls.addAll(urls); 
     89                this.factories.addAll(factories); 
    7490                jc = doJAXBContext(); 
    7591                marshaller = jc.createMarshaller(); 
     
    7793        } 
    7894 
     95        /** 
     96         * Transforms a JAXB created java object in its XML counterpart. 
     97         * @param obj the JAXB created instance 
     98         * @param os the OutputStrem where write the XML document 
     99         * @throws ResourceNotAvailable general Exception 
     100         * @throws JAXBException general JAXB exception             
     101         **/ 
    79102        public void marshall(Object obj, OutputStream os) throws ResourceNotAvailable, JAXBException { 
    80103                synchronized (marshaller) { 
     
    83106        } 
    84107 
     108         
     109        /** 
     110         * Transforms an XML document in its JAXB created java object counterpart. 
     111         * @param is the XML document InputStream 
     112         * @param declaredType the (JAXB generated) Class expected to describe the XML document 
     113         * @return an object representing the XML document  
     114         * @throws ResourceNotAvailable general Exception 
     115         * @throws JAXBException general JAXB exception             
     116         **/     
    85117        public <T> T unmarshall(InputStream is, Class<T> declaredType) throws ResourceNotAvailable, JAXBException { 
    86118                synchronized (unmarshaller) { 
     
    88120                } 
    89121        } 
    90          
     122 
    91123        private <T> JAXBElement<?> marshallerHelper(T res) throws ResourceNotAvailable { 
    92124                try { 
     
    102134 
    103135        private JAXBContext doJAXBContext() throws ResourceNotAvailable { 
     136                Set<String> controller = new HashSet<String>(); 
    104137                // MarshallerHelper 
    105138                StringBuffer sb = new StringBuffer(); 
    106139                try { 
    107140                        List<JarFile> jarFiles = new ArrayList<JarFile>(); 
    108                         for (URL url : urls) {  
     141                        for (URL url : urls) { 
    109142                                jarFiles.add(new JarFile(new File(url.toURI()))); 
    110143                        } 
     
    116149                                while (iter.hasMoreElements()) { 
    117150                                        entry = iter.nextElement(); 
    118                                         if (!entry.getName().endsWith("ObjectFactory.class")) 
     151 
     152                                        String name = entry.getName(); 
     153                                        name = name.substring(name.lastIndexOf('/') + 1, name.length()); 
     154                                        if (!name.equals("ObjectFactory.class")) 
    119155                                                continue; 
    120156 
    121                                         String name = entry.getName(); 
     157                                        name = entry.getName(); 
    122158                                        name = name.substring(0, name.length() - "ObjectFactory.class".length() - 1); 
    123159                                        name = name.replace('/', '.'); 
    124                                         if (sb.length() > 0) 
    125                                                 sb.append(":"); 
    126                                         sb.append(name); 
     160                                        // Skips already exists ObjectFactories and the ones related 
     161                                        // to the org.apache (probably others could be required) 
     162                                        if (controller.add(name)) { 
     163                                                for (String factory : factories) { 
     164                                                        if (name.contains(factory)) { 
     165                                                                if (sb.length() > 0) 
     166                                                                        sb.append(":"); 
     167                                                                sb.append(name); 
     168                                                        } 
     169                                                } 
     170                                        } 
    127171                                } 
    128172                        } 
     
    202246                return ret; 
    203247        } 
     248 
     249        private static List<URL> useClasspath() { 
     250                List<URL> urls = new ArrayList<URL>(); 
     251                final String pathSep = System.getProperty("path.separator"); 
     252                final String list = System.getProperty("java.class.path"); 
     253                for (final String path : list.split(pathSep)) { 
     254                        final File object = new java.io.File(path); 
     255                        try { 
     256                                urls.addAll(ls(object)); 
     257                        } catch (MalformedURLException e) { 
     258                                // TODO Auto-generated catch block 
     259                                e.printStackTrace(); 
     260                        } 
     261                } 
     262                return urls; 
     263        } 
     264 
     265        /** 
     266         * list recursively 
     267         *  
     268         * @throws MalformedURLException 
     269         */ 
     270        private static List<URL> ls(File f) throws MalformedURLException { 
     271                List<URL> urls = new ArrayList<URL>(); 
     272                if (!f.isDirectory() && f.getName().endsWith(".jar")) { 
     273                        urls.add(new URL("file", null, f.getPath())); 
     274                        System.out.println(f.getName()); 
     275                        return urls; 
     276                } 
     277 
     278                File list[] = f.listFiles(); 
     279                for (File file : list) { 
     280                        if (file.isDirectory()) 
     281                                ls(file); 
     282                        else { 
     283                                if (file.getName().endsWith(".jar")) { 
     284                                        urls.add(new URL("file", null, file.getPath())); 
     285                                } 
     286                        } 
     287                } 
     288                return urls; 
     289        } 
    204290} 
Note: See TracChangeset for help on using the changeset viewer.