Changeset 673


Ignore:
Timestamp:
03/15/09 17:47:12 (3 years ago)
Author:
jharrop
Message:

Support loading of external resources as Parts.

Location:
trunk/docx4j/src/main/java/org/docx4j/openpackaging
Files:
1 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/io/Load.java

    r608 r673  
    2929import javax.jcr.Session; 
    3030 
     31import org.apache.commons.vfs.FileContent; 
     32import org.apache.commons.vfs.FileObject; 
     33import org.apache.commons.vfs.FileSystemException; 
     34import org.apache.commons.vfs.VFS; 
    3135import org.apache.log4j.Logger; 
    3236import org.docx4j.JcrNodeMapper.NodeMapper; 
     
    4044import org.docx4j.openpackaging.packages.Package; 
    4145import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
     46import org.docx4j.openpackaging.parts.ExternalTarget; 
    4247import org.docx4j.openpackaging.parts.Part; 
    4348import org.docx4j.openpackaging.parts.PartName; 
    4449import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPart; 
     50import org.docx4j.openpackaging.parts.WordprocessingML.ImageGifPart; 
     51import org.docx4j.openpackaging.parts.WordprocessingML.ImageJpegPart; 
     52import org.docx4j.openpackaging.parts.WordprocessingML.ImagePngPart; 
    4553import org.dom4j.Document; 
    4654import org.dom4j.io.OutputFormat; 
     
    5866        public ContentTypeManager ctm; 
    5967 
     68        protected boolean loadExternalTargets = false;  
     69        public void loadExternalTargets(boolean loadExternalTargets) { 
     70                this.loadExternalTargets = loadExternalTargets; 
     71        } 
     72         
    6073        protected static void debugPrint( Document coreDoc) { 
    6174                try { 
     
    158171        } 
    159172                 
    160          
     173        public static BinaryPart getExternalResource(String absoluteTarget) throws Docx4JException { 
     174 
     175                try { 
     176                        FileObject fo = VFS.getManager().resolveFile(absoluteTarget); 
     177                         
     178                        ExternalTarget externalTarget = new ExternalTarget(absoluteTarget); 
     179                         
     180                        // Assume it is a binary part, though there is no reason in principle 
     181                        // that it couldn't be an XML part..                     
     182                        BinaryPart bp; 
     183                        if (absoluteTarget.toLowerCase().endsWith(".gif" )) { 
     184                                 
     185                                bp = new ImageGifPart(externalTarget);  
     186                                 
     187                        } else if  (absoluteTarget.toLowerCase().endsWith(".jpeg" ) 
     188                                        || absoluteTarget.toLowerCase().endsWith(".jpg" )) { 
     189                                 
     190                                bp = new ImageJpegPart(externalTarget);  
     191                                 
     192                        } else if (absoluteTarget.toLowerCase().endsWith(".png" )) { 
     193                                 
     194                                bp = new ImagePngPart(externalTarget);  
     195                                 
     196                        } else { 
     197                                log.warn("Using simple BinaryPart for " + absoluteTarget); 
     198                                bp = new BinaryPart(externalTarget); 
     199                        } 
     200                         
     201                        FileContent fc = fo.getContent(); 
     202                        bp.setBinaryData(fc.getInputStream());                   
     203                         
     204                        return bp; 
     205                         
     206                } catch (FileSystemException exc) { 
     207                        exc.printStackTrace(); 
     208                        throw new Docx4JException("Couldn't get FileObject", exc);                       
     209                } 
     210                 
     211        } 
    161212 
    162213} 
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/io/LoadFromJCR.java

    r638 r673  
    500500                 
    501501                } else {                         
    502                         // EXTERNAL 
    503                         /* "When set to External, the target attribute may be a relative 
    504                          *  reference or a URI.  If the target attribute is a relative 
    505                          *  reference, then that reference is interpreted relative to the 
    506                          *  location of the package." 
    507                          */ 
    508  
    509                         log.warn("Encountered external resource " + r.getTarget()  
    510                                            + " of type " + r.getType() ); 
    511                          
    512                         // As of 1 May 2008, we don't do anything with these yet. 
    513                         // No need to create a Part out of them until such time as 
    514                         // we need to read the contents. (External resources don't 
    515                         // seem to necessarily be described in [ContentTypes].xml ) 
    516                          
    517                         // When the document is saved, the relationship is simply 
    518                         // written again. 
    519                          
     502                        // EXTERNAL                      
     503                        if (loadExternalTargets) { 
     504                                log.warn("Loading external resource " + r.getTarget()  
     505                                                   + " of type " + r.getType() ); 
     506                                BinaryPart bp = getExternalResource(r.getTarget()); 
     507                                pkg.getExternalResources().put(bp.getExternalTarget(), bp);                      
     508                        } else {                                 
     509                                log.warn("Encountered (but not loading) external resource " + r.getTarget()  
     510                                                   + " of type " + r.getType() );                                
     511                        }                                                
    520512                        return; 
    521513                } 
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/io/LoadFromVFSZipFile.java

    r298 r673  
    5454                //      "webdav://jojada:password@192.168.23.129:8080/alfresco/webdav/User%20Homes/jojada/This%20is%20Heading1.docx"; 
    5555                log.info("Path: " + filepath ); 
    56                 LoadFromVFSZipFile loader = new LoadFromVFSZipFile(); 
     56                LoadFromVFSZipFile loader = new LoadFromVFSZipFile(true); 
    5757                loader.get(filepath);            
    5858        } 
    5959 
    6060        private LoadFromZipFile _loadFromZipFile; 
     61 
     62        public LoadFromVFSZipFile() { 
     63                this(true); 
     64        } 
    6165         
    62         public LoadFromVFSZipFile() { 
     66        public LoadFromVFSZipFile(boolean loadExternalTargets) { 
    6367                _loadFromZipFile = new LoadFromZipFile(); 
     68                _loadFromZipFile.loadExternalTargets(loadExternalTargets); 
    6469        } 
    6570 
    66         public LoadFromVFSZipFile(ContentTypeManager ctm) { 
     71        public LoadFromVFSZipFile(ContentTypeManager ctm, boolean loadExternalTargets) { 
    6772                _loadFromZipFile = new LoadFromZipFile(ctm); 
     73                _loadFromZipFile.loadExternalTargets(loadExternalTargets); 
    6874        } 
    6975         
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/io/LoadFromZipFile.java

    r669 r673  
    354354                         
    355355                } else {                         
    356                         // EXTERNAL 
    357                         /* "When set to External, the target attribute may be a relative 
    358                          *  reference or a URI.  If the target attribute is a relative 
    359                          *  reference, then that reference is interpreted relative to the 
    360                          *  location of the package." 
    361                          */ 
    362  
    363                         log.warn("Encountered external resource " + r.getTarget()  
    364                                            + " of type " + r.getType() ); 
    365                          
    366                         // As of 1 May 2008, we don't do anything with these yet. 
    367                         // No need to create a Part out of them until such time as 
    368                         // we need to read the contents. (External resources don't 
    369                         // seem to necessarily be described in [ContentTypes].xml ) 
    370                          
    371                         // When the document is saved, the relationship is simply 
    372                         // written again. 
    373                          
     356                        // EXTERNAL                      
     357                        if (loadExternalTargets) { 
     358                                log.warn("Loading external resource " + r.getTarget()  
     359                                                   + " of type " + r.getType() ); 
     360                                BinaryPart bp = getExternalResource(r.getTarget()); 
     361                                pkg.getExternalResources().put(bp.getExternalTarget(), bp);                      
     362                        } else {                                 
     363                                log.warn("Encountered (but not loading) external resource " + r.getTarget()  
     364                                                   + " of type " + r.getType() );                                
     365                        }                                                
    374366                        return; 
    375367                } 
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/packages/Package.java

    r587 r673  
    2121 
    2222package org.docx4j.openpackaging.packages; 
     23 
     24import java.util.HashMap; 
    2325 
    2426import org.apache.log4j.Logger; 
     
    3133import org.docx4j.openpackaging.parts.DocPropsCustomPart; 
    3234import org.docx4j.openpackaging.parts.DocPropsExtendedPart; 
     35import org.docx4j.openpackaging.parts.ExternalTarget; 
    3336import org.docx4j.openpackaging.parts.Part; 
    3437import org.docx4j.openpackaging.parts.PartName; 
     
    5154         * parts in the package (_except_ relationship parts),  
    5255         * not just those referred to by the package-level relationships. 
     56         * It doesn't include external resources. 
    5357         */ 
    5458        protected Parts parts = new Parts(); 
     
    5963        public Parts getParts() { 
    6064 
     65                // Having a separate Parts object doesn't really buy 
     66                // us much, but live with it... 
     67                 
    6168                return parts;            
    6269        } 
     70         
     71        protected HashMap<ExternalTarget, Part> externalResources  
     72                = new HashMap<ExternalTarget, Part>(); 
     73        public HashMap<ExternalTarget, Part> getExternalResources() { 
     74                return externalResources;                
     75        }        
    6376         
    6477        protected ContentTypeManager contentTypeManager; 
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/BinaryPart.java

    r610 r673  
    2727import org.apache.poi.poifs.filesystem.DocumentInputStream; 
    2828import org.docx4j.openpackaging.exceptions.InvalidFormatException; 
     29import org.docx4j.openpackaging.parts.ExternalTarget; 
    2930import org.docx4j.openpackaging.parts.Part; 
    3031import org.docx4j.openpackaging.parts.PartName; 
     
    4142                // provide that information. 
    4243                 
     44        } 
     45         
     46         
     47        ExternalTarget externalTarget = null;    
     48        public BinaryPart(ExternalTarget externalTarget) { 
     49                 
     50                this.externalTarget = externalTarget; 
     51                 
     52        } 
     53        public ExternalTarget getExternalTarget() { 
     54                return externalTarget; 
    4355        } 
    4456         
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/BinaryPartAbstractImage.java

    r633 r673  
    4747import org.docx4j.openpackaging.exceptions.InvalidFormatException; 
    4848import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
     49import org.docx4j.openpackaging.parts.ExternalTarget; 
    4950import org.docx4j.openpackaging.parts.Part; 
    5051import org.docx4j.openpackaging.parts.PartName; 
     
    7071                 
    7172        } 
     73         
     74        public BinaryPartAbstractImage(ExternalTarget externalTarget) { 
     75                super(externalTarget); 
     76        } 
     77         
    7278         
    7379        public static String generateName() { 
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/ImageGifPart.java

    r605 r673  
    2626import org.docx4j.openpackaging.contenttype.ContentTypes; 
    2727import org.docx4j.openpackaging.exceptions.InvalidFormatException; 
     28import org.docx4j.openpackaging.parts.ExternalTarget; 
    2829import org.docx4j.openpackaging.parts.Part; 
    2930import org.docx4j.openpackaging.parts.PartName; 
     
    4344        } 
    4445         
     46        public ImageGifPart(ExternalTarget externalTarget) { 
     47                super(externalTarget); 
     48                init(); 
     49        }        
     50         
    4551        public void init() { 
    4652                // Used if this Part is added to [Content_Types].xml  
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/ImageJpegPart.java

    r605 r673  
    2626import org.docx4j.openpackaging.contenttype.ContentTypes; 
    2727import org.docx4j.openpackaging.exceptions.InvalidFormatException; 
     28import org.docx4j.openpackaging.parts.ExternalTarget; 
    2829import org.docx4j.openpackaging.parts.Part; 
    2930import org.docx4j.openpackaging.parts.PartName; 
     
    4344        } 
    4445         
     46        public ImageJpegPart(ExternalTarget externalTarget) { 
     47                super(externalTarget); 
     48                init();          
     49        } 
     50         
     51         
    4552        public void init() { 
    4653                // Used if this Part is added to [Content_Types].xml  
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/ImagePngPart.java

    r605 r673  
    2626import org.docx4j.openpackaging.contenttype.ContentTypes; 
    2727import org.docx4j.openpackaging.exceptions.InvalidFormatException; 
     28import org.docx4j.openpackaging.parts.ExternalTarget; 
    2829import org.docx4j.openpackaging.parts.Part; 
    2930import org.docx4j.openpackaging.parts.PartName; 
     
    4445        } 
    4546         
     47        public ImagePngPart(ExternalTarget externalTarget) { 
     48                super(externalTarget); 
     49                init(); 
     50        }        
     51         
    4652        public void init() { 
    4753                // Used if this Part is added to [Content_Types].xml  
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/ImageTiffPart.java

    r605 r673  
    2626import org.docx4j.openpackaging.contenttype.ContentTypes; 
    2727import org.docx4j.openpackaging.exceptions.InvalidFormatException; 
     28import org.docx4j.openpackaging.parts.ExternalTarget; 
    2829import org.docx4j.openpackaging.parts.Part; 
    2930import org.docx4j.openpackaging.parts.PartName; 
     
    4344        } 
    4445         
     46        public ImageTiffPart(ExternalTarget externalTarget) { 
     47                super(externalTarget); 
     48                init(); 
     49        } 
     50                 
    4551        public void init() { 
    4652                // Used if this Part is added to [Content_Types].xml  
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/relationships/RelationshipsPart.java

    r668 r673  
    7474import org.docx4j.openpackaging.Base; 
    7575import org.docx4j.openpackaging.packages.Package; 
     76import org.docx4j.openpackaging.parts.ExternalTarget; 
    7677import org.docx4j.openpackaging.parts.Part; 
    7778import org.docx4j.openpackaging.parts.PartName; 
     
    292293                log.info(" source is  " + sourceP.getPartName().toString() ); 
    293294        // eg rId1 points to fonts/font1.odttf 
    294                          
    295                 URI uri = null; 
    296  
    297                 try { 
    298                         uri = org.docx4j.openpackaging.URIHelper 
    299                                         .resolvePartUri(sourceP.partName.getURI(), new URI( 
    300                                                         r.getTarget())); 
    301                 } catch (URISyntaxException e) { 
    302                         log.error("Cannot convert " + r.getTarget() 
    303                                         + " in a valid relationship URI-> ignored", e); 
    304                 }                
    305          
    306          
    307         try { 
    308                         return getPackage().getParts().get( new PartName(uri, true )); 
    309                 } catch (InvalidFormatException e) { 
    310                         log.error("Couldn't get part using PartName: " + uri, e); 
    311                         return null; 
     295                 
     296                if (r.getTargetMode() == null 
     297                                || !r.getTargetMode().equals("External") ) { 
     298                         
     299                        // Usual case 
     300                        URI uri = null; 
     301         
     302                        try { 
     303                                uri = org.docx4j.openpackaging.URIHelper 
     304                                                .resolvePartUri(sourceP.partName.getURI(), new URI( 
     305                                                                r.getTarget())); 
     306                        } catch (URISyntaxException e) { 
     307                                log.error("Cannot convert " + r.getTarget() 
     308                                                + " in a valid relationship URI-> ignored", e); 
     309                        }                
     310                                 
     311                try { 
     312                                return getPackage().getParts().get( new PartName(uri, true )); 
     313                        } catch (InvalidFormatException e) { 
     314                                log.error("Couldn't get part using PartName: " + uri, e); 
     315                                return null; 
     316                        } 
     317                         
     318                } else { 
     319                        // EXTERNAL 
     320                        return getPackage().getExternalResources().get( 
     321                                        new ExternalTarget( r.getTarget() ) ); 
     322                        // TODO - doesn't handle a relative reference, 
     323                        // because the keys are absolute references 
    312324                } 
    313325        } 
Note: See TracChangeset for help on using the changeset viewer.