Changeset 1707


Ignore:
Timestamp:
11/12/11 23:38:01 (6 months ago)
Author:
jharrop
Message:

Improved approach to specifying appropriate namespace prefix mapper

Location:
tags/VERSION_2_7_1/docx4j/src/main/java/org/docx4j/jaxb
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • tags/VERSION_2_7_1/docx4j/src/main/java/org/docx4j/jaxb/Context.java

    r1579 r1707  
    5050                 
    5151                // Display diagnostic info about version of JAXB being used. 
    52         try { 
    53                 Class.forName("com.sun.xml.bind.marshaller.MinimumEscapeHandler"); 
    54                 log.info("JAXB: Using RI"); 
    55  
    56         } catch (ClassNotFoundException cnfe) { 
    57                 // JAXB Reference Implementation not present 
    58           log.info("JAXB: RI not present.  Trying Java 6 implementation."); 
    59                 try { 
    60                                 Class.forName("com.sun.xml.internal.bind.marshaller.MinimumEscapeHandler"); 
    61         log.info("JAXB: Using Java 6 implementation."); 
    62           } catch (ClassNotFoundException e) { 
    63             log.info("JAXB: neither Reference Implementation nor Java 6 implementation present?"); 
    64           } 
    65       } 
     52                Object namespacePrefixMapper; 
     53                try { 
     54                        namespacePrefixMapper = NamespacePrefixMapperUtils.getPrefixMapper(); 
     55                        if ( namespacePrefixMapper.getClass().getName().equals("org.docx4j.jaxb.NamespacePrefixMapperSunInternal") ) { 
     56                                // Java 6 
     57                                log.info("Using Java 6/7 JAXB implementation"); 
     58                        } else { 
     59                                log.info("Using JAXB Reference Implementation");                         
     60                        } 
     61                } catch (JAXBException e) { 
     62                        log.error("PANIC! No suitable JAXB implementation available"); 
     63                        e.printStackTrace(); 
     64                } 
    6665       
    6766      try {  
  • tags/VERSION_2_7_1/docx4j/src/main/java/org/docx4j/jaxb/NamespacePrefixMapperUtils.java

    r1655 r1707  
    11package org.docx4j.jaxb; 
    22 
     3import javax.xml.bind.JAXBContext; 
    34import javax.xml.bind.JAXBException; 
    45import javax.xml.bind.Marshaller; 
     
    2728         */ 
    2829         
     30        private static JAXBContext testContext; 
     31         
     32        private static Object prefixMapper; 
     33        private static Object prefixMapperRels; 
     34         
    2935         
    3036        public static Object getPrefixMapper() throws JAXBException { 
    3137                 
    32         Class c; 
    33         try { 
    34                 c = Class.forName("com.sun.xml.bind.marshaller.MinimumEscapeHandler"); 
    35                 return new NamespacePrefixMapper();  // JAXB Reference Implementation  
    36         } catch (ClassNotFoundException cnfe) { 
    37                 // JAXB Reference Implementation not present 
    38                 // Use Java 6 implementation 
    39                 log.debug("JAXB RI (com.sun.xml.bind.marshaller.MinimumEscapeHandler) not present.  Trying Java 6 implementation."); 
    40                 try { 
    41                                 c = Class.forName("com.sun.xml.internal.bind.marshaller.MinimumEscapeHandler"); 
    42                         } catch (ClassNotFoundException e) { 
    43                                 e.printStackTrace(); 
    44                                 log.error("JAXB: neither Reference Implementation nor Java 6 implementation present?", e); 
     38                if (prefixMapper!=null) return prefixMapper; 
     39                 
     40                if (testContext==null) { 
     41                         
     42                        // JBOSS might use a different class loader to load JAXBContext, which causes problems, 
     43                        // so explicitly specify our class loader. 
     44                        NamespacePrefixMapperUtils tmp = new NamespacePrefixMapperUtils(); 
     45                        java.lang.ClassLoader classLoader = tmp.getClass().getClassLoader(); 
     46                         
     47                        testContext = JAXBContext.newInstance("org.docx4j.relationships",classLoader ); 
     48                } 
     49                 
     50                Marshaller m=testContext.createMarshaller(); 
     51                try { 
     52                        // Assume use of Java 6 implementation (ie not RI) 
     53                        m.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper",  
     54                                        new NamespacePrefixMapperSunInternal() ); 
     55                        log.info("Using NamespacePrefixMapperSunInternal, which is suitable for Java 6"); 
     56                        prefixMapper = new NamespacePrefixMapperSunInternal(); 
     57                        return prefixMapper; 
     58                } catch (java.lang.NoClassDefFoundError notJava6) { 
     59                        // javax.xml.bind.PropertyException 
     60                        log.error(notJava6.getMessage() + " .. trying RI."); 
     61                        try { 
     62                                // Try RI suitable one 
     63                                m.setProperty("com.sun.xml.bind.namespacePrefixMapper",  
     64                                                new NamespacePrefixMapper() ); 
     65                                log.info("Using NamespacePrefixMapper, which is suitable for the JAXB RI"); 
     66                                prefixMapper = new NamespacePrefixMapper(); 
     67                                return prefixMapper; 
     68                        } catch (javax.xml.bind.PropertyException notRIEither) { 
     69                                notRIEither.printStackTrace(); 
     70                                log.error("JAXB: neither Reference Implementation nor Java 6 implementation present?", notRIEither); 
    4571                                throw new JAXBException("JAXB: neither Reference Implementation nor Java 6 implementation present?"); 
    4672                        } 
    47                 return new NamespacePrefixMapperSunInternal(); 
    48         } 
     73                         
     74                } 
    4975        } 
    5076 
    5177         
    5278        public static Object getPrefixMapperRelationshipsPart() throws JAXBException { 
     79 
     80                if (prefixMapperRels!=null) return prefixMapperRels; 
     81                if (testContext==null) { 
     82                         
     83                        // JBOSS might use a different class loader to load JAXBContext, which causes problems, 
     84                        // so explicitly specify our class loader. 
     85                        NamespacePrefixMapperUtils tmp = new NamespacePrefixMapperUtils(); 
     86                        java.lang.ClassLoader classLoader = tmp.getClass().getClassLoader(); 
     87                         
     88                        testContext = JAXBContext.newInstance("org.docx4j.relationships",classLoader ); 
     89                } 
    5390                 
    54         Class c; 
    55         try { 
    56                 c = Class.forName("com.sun.xml.bind.marshaller.MinimumEscapeHandler"); 
    57                 return new NamespacePrefixMapperRelationshipsPart(); 
    58         } catch (ClassNotFoundException cnfe) { 
    59                 // JAXB Reference Implementation not present 
    60                 log.debug("JAXB RI (com.sun.xml.bind.marshaller.MinimumEscapeHandler) not present.  Trying Java 6 implementation."); 
    61                 try { 
    62                                 c = Class.forName("com.sun.xml.internal.bind.marshaller.MinimumEscapeHandler"); 
    63                         } catch (ClassNotFoundException e) { 
    64                                 e.printStackTrace(); 
    65                                 log.error("JAXB: neither Reference Implementation nor Java 6 implementation present?", e); 
     91                Marshaller m=testContext.createMarshaller(); 
     92                try { 
     93                        // Assume use of Java 6 implementation (ie not RI) 
     94                        m.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper",  
     95                                        new NamespacePrefixMapperRelationshipsPartSunInternal() ); 
     96                        log.info("Using NamespacePrefixMapperSunInternal, which is suitable for Java 6"); 
     97                        prefixMapperRels = new NamespacePrefixMapperRelationshipsPartSunInternal(); 
     98                        return prefixMapperRels; 
     99                } catch (java.lang.NoClassDefFoundError notJava6) { 
     100                        // javax.xml.bind.PropertyException 
     101                        log.error(notJava6.getMessage() + " .. trying RI."); 
     102                        try { 
     103                                // Try RI suitable one 
     104                                m.setProperty("com.sun.xml.bind.namespacePrefixMapper",  
     105                                                new NamespacePrefixMapperRelationshipsPart() ); 
     106                                log.info("Using NamespacePrefixMapperRelationshipsPart, which is suitable for the JAXB RI"); 
     107                                prefixMapperRels = new NamespacePrefixMapperRelationshipsPart(); 
     108                                return prefixMapperRels; 
     109                        } catch (javax.xml.bind.PropertyException notRIEither) { 
     110                                notRIEither.printStackTrace(); 
     111                                log.error("JAXB: neither Reference Implementation nor Java 6 implementation present?", notRIEither); 
    66112                                throw new JAXBException("JAXB: neither Reference Implementation nor Java 6 implementation present?"); 
    67113                        } 
    68                 return new NamespacePrefixMapperRelationshipsPartSunInternal(); 
    69         } 
     114                         
     115                }                
    70116        } 
    71117         
Note: See TracChangeset for help on using the changeset viewer.