Changeset 1605


Ignore:
Timestamp:
07/09/11 08:46:46 (11 months ago)
Author:
jharrop
Message:

Proof of concept of an mc:AlternateContent preprocessor.

Location:
trunk/docx4j/src/main/java/org/docx4j
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/docx4j/src/main/java/org/docx4j/jaxb/JaxbValidationEventHandler.java

    r973 r1605  
    2121package org.docx4j.jaxb; 
    2222 
     23import java.io.IOException; 
     24 
    2325import javax.xml.bind.ValidationEvent; 
    2426import javax.xml.bind.ValidationEventHandler; 
    2527import javax.xml.bind.ValidationEventLocator; 
     28import javax.xml.transform.Source; 
     29import javax.xml.transform.Templates; 
     30import javax.xml.transform.TransformerConfigurationException; 
     31import javax.xml.transform.stream.StreamSource; 
    2632 
    2733import org.apache.log4j.Logger; 
     34import org.docx4j.XmlUtils; 
    2835 
    2936 
     
    3340        private static Logger log = Logger.getLogger(JaxbValidationEventHandler.class);          
    3441         
     42        private boolean shouldContinue = true; 
     43        public void setContinue(boolean val) { 
     44                shouldContinue = val; 
     45        } 
     46         
     47        public final static String UNEXPECTED_MC_ALTERNATE_CONTENT = "unexpected element (uri:\"http://schemas.openxmlformats.org/markup-compatibility/2006\", local:\"AlternateContent\")"; 
     48         
     49        static Templates mcPreprocessorXslt;     
     50         
     51        public static Templates getMcPreprocessor() throws IOException, TransformerConfigurationException { 
     52                 
     53                if (mcPreprocessorXslt==null) { 
     54                        try { 
     55                                Source xsltSource  = new StreamSource( 
     56                                                org.docx4j.utils.ResourceUtils.getResource( 
     57                                                                "org/docx4j/jaxb/mc-preprocessor.xslt")); 
     58                                mcPreprocessorXslt = XmlUtils.getTransformerTemplate(xsltSource); 
     59                        } catch (IOException e) { 
     60                                log.error(e); 
     61                                throw(e); 
     62                        } catch (TransformerConfigurationException e) { 
     63                                log.error(e); 
     64                                throw(e); 
     65                        } 
     66                } 
     67                 
     68                return mcPreprocessorXslt; 
     69                 
     70        } 
    3571         
    3672    public boolean handleEvent(ValidationEvent ve) {             
     
    69105      // (Marshalling, Unmarshalling, Validating) 
    70106      log.info("continuing (with possible element/attribute loss)"); 
    71        return true; 
     107       return shouldContinue; 
    72108              
    73109     } 
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/MainDocumentPart.java

    r1505 r1605  
    3333import javax.xml.bind.JAXBElement; 
    3434import javax.xml.bind.JAXBException; 
     35import javax.xml.bind.UnmarshalException; 
    3536import javax.xml.bind.Unmarshaller; 
     37import javax.xml.bind.util.JAXBResult; 
    3638import javax.xml.parsers.DocumentBuilderFactory; 
     39import javax.xml.transform.Result; 
     40import javax.xml.transform.Templates; 
     41import javax.xml.transform.dom.DOMResult; 
    3742 
    3843import org.apache.log4j.Logger; 
     
    4247import org.docx4j.dml.CTNonVisualDrawingProps; 
    4348import org.docx4j.jaxb.Context; 
     49import org.docx4j.jaxb.JaxbValidationEventHandler; 
    4450import org.docx4j.model.PropertyResolver; 
    4551import org.docx4j.model.listnumbering.AbstractListNumberingDefinition; 
     
    269275                        binder = jc.createBinder(); 
    270276                         
    271                         binder.setEventHandler( 
    272                                         new org.docx4j.jaxb.JaxbValidationEventHandler()); 
    273                          
    274                         jaxbElement =  (org.docx4j.wml.Document) binder.unmarshal( doc ); 
     277                        JaxbValidationEventHandler eventHandler = new JaxbValidationEventHandler(); 
     278                        eventHandler.setContinue(false); 
     279                        binder.setEventHandler(eventHandler); 
     280                         
     281                        try { 
     282                                jaxbElement =  (org.docx4j.wml.Document) binder.unmarshal( doc ); 
     283                        } catch (UnmarshalException ue) { 
     284 
     285                                // mimic docx4j 2.7.0 and earlier behaviour 
     286                                eventHandler.setContinue(true); 
     287                                 
     288                                if (ue.getMessage().contains(JaxbValidationEventHandler.UNEXPECTED_MC_ALTERNATE_CONTENT)) { 
     289                                        // Try our preprocessor 
     290                                        log.info("encountered mc:AlternateContent; pre-processing"); 
     291                                         
     292                                        // There is no JAXBResult(binder), 
     293                                        // so use a  
     294                                        DOMResult result = new DOMResult(); 
     295                                         
     296                                        Templates mcPreprocessorXslt = JaxbValidationEventHandler.getMcPreprocessor(); 
     297                                        XmlUtils.transform(doc, mcPreprocessorXslt, null, result); 
     298                                         
     299                                        doc = (org.w3c.dom.Document)result.getNode(); 
     300                                         
     301                                } else { 
     302                                        log.error(ue); 
     303                                        log.info("trying again; likely attribute/element loss");                                         
     304                                } 
     305                                jaxbElement =  (org.docx4j.wml.Document) binder.unmarshal( doc );                                        
     306                                 
     307                        } 
    275308                         
    276309                        return jaxbElement; 
Note: See TracChangeset for help on using the changeset viewer.