From: Yegor Kozlov Date: Sun, 12 Oct 2008 13:10:30 +0000 (+0000) Subject: refactored POIXMLFactory and related classes; simplified XSSFRelation - now it's... X-Git-Tag: ooxml_20081107~29 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e308696df9128f7eebb43fccdd57836552e3d6b6;p=poi.git refactored POIXMLFactory and related classes; simplified XSSFRelation - now it's just a set of definitions of XSSF relations, all read/load stuff is not used anymore and was removed. Also, removed Workbook.getCustomPallete() - it's OLE-specific git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@703814 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Workbook.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Workbook.java index 2ed1c3c7b1..91d0cc9851 100644 --- a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Workbook.java +++ b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Workbook.java @@ -374,8 +374,6 @@ public interface Workbook { */ void removeName(String name); - Palette getCustomPalette(); - /** * Adds a picture to the workbook. * diff --git a/src/ooxml/java/org/apache/poi/POIXMLDocument.java b/src/ooxml/java/org/apache/poi/POIXMLDocument.java index 74be9909ca..806fd6381e 100644 --- a/src/ooxml/java/org/apache/poi/POIXMLDocument.java +++ b/src/ooxml/java/org/apache/poi/POIXMLDocument.java @@ -22,7 +22,6 @@ import java.util.List; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.util.IOUtils; -import org.apache.poi.util.PackageHelper; import org.apache.xmlbeans.XmlException; import org.openxml4j.exceptions.InvalidFormatException; import org.openxml4j.exceptions.OpenXML4JException; diff --git a/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java b/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java index 979caeea30..e809a7729d 100755 --- a/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java +++ b/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java @@ -143,43 +143,35 @@ public class POIXMLDocumentPart { * Create a new child POIXMLDocumentPart * * @param descriptor the part descriptor - * @param cls the Class object identifying the type of instance to create + * @param factory the factory that will create an instance of the requested relation * @return the created child POIXMLDocumentPart */ - protected POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, Class cls){ - return createRelationship(descriptor, cls, -1); + protected POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory){ + return createRelationship(descriptor, factory, -1, false); } - /** - * Create a new child POIXMLDocumentPart - * - * @param descriptor the part descriptor - * @param cls the Class object identifying the type of instance to create - * @param idx part number - * @return the created child POIXMLDocumentPart - */ - protected POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, Class cls, int idx){ - return createRelationship(descriptor, cls, idx, false); + protected POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx){ + return createRelationship(descriptor, factory, idx, false); } /** * Create a new child POIXMLDocumentPart * * @param descriptor the part descriptor - * @param cls the Class object identifying the type of instance to create + * @param factory the factory that will create an instance of the requested relation * @param idx part number - * @param norel if true, then no relationship is added. + * @param noRelation if true, then no relationship is added. * @return the created child POIXMLDocumentPart */ - protected POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, Class cls, int idx, boolean norel){ + protected POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx, boolean noRelation){ try { PackagePartName ppName = PackagingURIHelper.createPartName(descriptor.getFileName(idx)); PackageRelationship rel = null; - if(!norel) rel = packagePart.addRelationship(ppName, TargetMode.INTERNAL, descriptor.getRelation()); + if(!noRelation) rel = packagePart.addRelationship(ppName, TargetMode.INTERNAL, descriptor.getRelation()); PackagePart part = packagePart.getPackage().createPart(ppName, descriptor.getContentType()); - POIXMLDocumentPart doc = cls.newInstance(); + POIXMLDocumentPart doc = factory.newDocumentPart(descriptor); doc.packageRel = rel; doc.packagePart = part; doc.parent = this; @@ -206,7 +198,7 @@ public class POIXMLDocumentPart { logger.log(POILogger.ERROR, "Skipped invalid entry " + rel.getTargetURI()); continue; } - POIXMLDocumentPart childPart = factory.create(rel, p); + POIXMLDocumentPart childPart = factory.createDocumentPart(rel, p); childPart.parent = this; addRelation(childPart); diff --git a/src/ooxml/java/org/apache/poi/POIXMLFactory.java b/src/ooxml/java/org/apache/poi/POIXMLFactory.java index 6909cb9c31..4b922dd146 100755 --- a/src/ooxml/java/org/apache/poi/POIXMLFactory.java +++ b/src/ooxml/java/org/apache/poi/POIXMLFactory.java @@ -25,16 +25,24 @@ import org.openxml4j.opc.PackagePart; * * @author Yegor Kozlov */ -public class POIXMLFactory { +public abstract class POIXMLFactory { /** - * Creates a new instance of a {@link POIXMLDocumentPart} + * Create a POIXMLDocumentPart from existing package part and relation. This method is called + * from {@link POIXMLDocumentPart#read(POIXMLFactory)} when parsing a document * * @param rel the package part relationship * @param part the PackagePart representing the created instance * @return A new instance of a POIXMLDocumentPart. */ - public POIXMLDocumentPart create(PackageRelationship rel, PackagePart part){ - return new POIXMLDocumentPart(part, rel); - } + public abstract POIXMLDocumentPart createDocumentPart(PackageRelationship rel, PackagePart part); + + /** + * Create a new POIXMLDocumentPart using the supplied descriptor. This method is used when adding new parts + * to a document, for example, when adding a sheet to a workbook, slide to a presentation, etc. + * + * @param descriptor described the object to create + * @return A new instance of a POIXMLDocumentPart. + */ + public abstract POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor); } diff --git a/src/ooxml/java/org/apache/poi/POIXMLRelation.java b/src/ooxml/java/org/apache/poi/POIXMLRelation.java index fb001efdcc..a11c49ca18 100755 --- a/src/ooxml/java/org/apache/poi/POIXMLRelation.java +++ b/src/ooxml/java/org/apache/poi/POIXMLRelation.java @@ -21,7 +21,7 @@ package org.apache.poi; * * @author Yegor Kozlov */ -public class POIXMLRelation { +public abstract class POIXMLRelation { /** * Describes the content stored in a part. @@ -38,19 +38,36 @@ public class POIXMLRelation { */ protected String _defaultName; + /** + * Defines what object is used to construct instances of this relationship + */ + private Class _cls; + /** * Instantiates a POIXMLRelation. * * @param type content type * @param rel relationship * @param defaultName default item name + * @param cls defines what object is used to construct instances of this relationship */ - public POIXMLRelation(String type, String rel, String defaultName) { + public POIXMLRelation(String type, String rel, String defaultName, Class cls) { _type = type; _relation = rel; _defaultName = defaultName; + _cls = cls; } + /** + * Instantiates a POIXMLRelation. + * + * @param type content type + * @param rel relationship + * @param defaultName default item name + */ + public POIXMLRelation(String type, String rel, String defaultName) { + this(type, rel, defaultName, null); + } /** * Return the content type. Content types define a media type, a subtype, and an * optional set of parameters, as defined in RFC 2616. @@ -93,4 +110,13 @@ public class POIXMLRelation { } return _defaultName.replace("#", Integer.toString(index)); } + + /** + * Return type of the obejct used to construct instances of this relationship + * + * @return the class of the object used to construct instances of this relation + */ + public Class getRelationClass(){ + return _cls; + } } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java index 52b8d63f9a..0900183e85 100755 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java @@ -19,14 +19,12 @@ package org.apache.poi.xssf.usermodel; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLFactory; import org.apache.poi.POIXMLException; -import org.apache.poi.xssf.model.SharedStringsTable; -import org.apache.poi.xssf.model.StylesTable; -import org.apache.poi.xssf.model.CommentsTable; +import org.apache.poi.POIXMLRelation; +import org.apache.poi.util.POILogger; +import org.apache.poi.util.POILogFactory; import org.openxml4j.opc.PackageRelationship; import org.openxml4j.opc.PackagePart; -import java.util.Map; -import java.util.HashMap; import java.lang.reflect.Constructor; /** @@ -35,25 +33,40 @@ import java.lang.reflect.Constructor; * @author Yegor Kozlov */ public class XSSFFactory extends POIXMLFactory { - protected static Map parts = new HashMap(); - static { - parts.put(XSSFRelation.WORKSHEET.getRelation(), XSSFSheet.class); - parts.put(XSSFRelation.SHARED_STRINGS.getRelation(), SharedStringsTable.class); - parts.put(XSSFRelation.STYLES.getRelation(), StylesTable.class); - parts.put(XSSFRelation.SHEET_COMMENTS.getRelation(), CommentsTable.class); - parts.put(XSSFRelation.DRAWINGS.getRelation(), XSSFDrawing.class); - parts.put(XSSFRelation.IMAGES.getRelation(), XSSFPictureData.class); + private static POILogger logger = POILogFactory.getLogger(XSSFFactory.class); + + private XSSFFactory(){ + + } + + public static XSSFFactory getInstance(){ + return new XSSFFactory(); } - public POIXMLDocumentPart create(PackageRelationship rel, PackagePart p){ - Class cls = parts.get(rel.getRelationshipType()); - if(cls == null) return super.create(rel, p); + public POIXMLDocumentPart createDocumentPart(PackageRelationship rel, PackagePart part){ + XSSFRelation descriptor = XSSFRelation.getInstance(rel.getRelationshipType()); + if(descriptor == null || descriptor.getRelationClass() == null){ + logger.log(POILogger.DEBUG, "using default POIXMLDocumentPart for " + rel.getRelationshipType()); + return new POIXMLDocumentPart(part, rel); + } try { + Class cls = descriptor.getRelationClass(); Constructor constructor = cls.getConstructor(PackagePart.class, PackageRelationship.class); - return constructor.newInstance(p, rel); + return constructor.newInstance(part, rel); + } catch (Exception e){ + throw new POIXMLException(e); + } + } + + public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor){ + try { + Class cls = descriptor.getRelationClass(); + Constructor constructor = cls.getConstructor(); + return constructor.newInstance(); } catch (Exception e){ throw new POIXMLException(e); } } + } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java index fdc49fcaca..eebd5d6d4b 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java @@ -39,12 +39,12 @@ public class XSSFPictureData extends POIXMLDocumentPart implements PictureData { protected static final POIXMLRelation[] RELATIONS; static { RELATIONS = new POIXMLRelation[8]; - RELATIONS[Workbook.PICTURE_TYPE_EMF] = new POIXMLRelation("image/x-emf", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.emf"); - RELATIONS[Workbook.PICTURE_TYPE_WMF] = new POIXMLRelation("image/x-wmf", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.wmf"); - RELATIONS[Workbook.PICTURE_TYPE_PICT] = new POIXMLRelation("image/pict", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.pict"); - RELATIONS[Workbook.PICTURE_TYPE_JPEG] = new POIXMLRelation("image/jpeg", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.jpeg"); - RELATIONS[Workbook.PICTURE_TYPE_PNG] = new POIXMLRelation("image/png", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.png"); - RELATIONS[Workbook.PICTURE_TYPE_DIB] = new POIXMLRelation("image/dib", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.dib"); + RELATIONS[Workbook.PICTURE_TYPE_EMF] = XSSFRelation.IMAGE_EMF; + RELATIONS[Workbook.PICTURE_TYPE_WMF] = XSSFRelation.IMAGE_WMF; + RELATIONS[Workbook.PICTURE_TYPE_PICT] = XSSFRelation.IMAGE_PICT; + RELATIONS[Workbook.PICTURE_TYPE_JPEG] = XSSFRelation.IMAGE_JPEG; + RELATIONS[Workbook.PICTURE_TYPE_PNG] = XSSFRelation.IMAGE_PNG; + RELATIONS[Workbook.PICTURE_TYPE_DIB] = XSSFRelation.IMAGE_DIB; } /** diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java index 53197200b1..ef9bf7fbb1 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java @@ -18,39 +18,37 @@ package org.apache.poi.xssf.usermodel; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; +import java.util.Map; +import java.util.HashMap; import org.apache.poi.POIXMLDocument; import org.apache.poi.POIXMLRelation; +import org.apache.poi.POIXMLDocumentPart; +import org.apache.poi.xssf.model.StylesTable; +import org.apache.poi.xssf.model.SharedStringsTable; +import org.apache.poi.xssf.model.CommentsTable; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; -import org.apache.poi.xssf.model.BinaryPart; -import org.apache.poi.xssf.model.CommentsTable; -import org.apache.poi.xssf.model.Control; -import org.apache.poi.xssf.model.Drawing; -import org.apache.poi.xssf.model.SharedStringsTable; -import org.apache.poi.xssf.model.StylesTable; -import org.apache.poi.xssf.model.ThemeTable; -import org.apache.poi.xssf.model.XSSFChildContainingModel; -import org.apache.poi.xssf.model.XSSFModel; -import org.apache.poi.xssf.model.XSSFWritableModel; import org.openxml4j.exceptions.InvalidFormatException; import org.openxml4j.opc.PackagePart; import org.openxml4j.opc.PackagePartName; import org.openxml4j.opc.PackageRelationship; import org.openxml4j.opc.PackageRelationshipCollection; import org.openxml4j.opc.PackagingURIHelper; -import org.openxml4j.opc.TargetMode; /** * */ -public final class XSSFRelation extends POIXMLRelation { +public final class XSSFRelation extends POIXMLRelation { + + private static POILogger log = POILogFactory.getLogger(XSSFRelation.class); + + /** + * A map to lookup POIXMLRelation by its relation type + */ + protected static Map _table = new HashMap(); + public static final XSSFRelation WORKBOOK = new XSSFRelation( "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", @@ -68,15 +66,15 @@ public final class XSSFRelation extends POIXMLRelation { "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", "/xl/worksheets/sheet#.xml", - null + XSSFSheet.class ); - public static final XSSFRelation SHARED_STRINGS = create( + public static final XSSFRelation SHARED_STRINGS = new XSSFRelation( "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", "/xl/sharedStrings.xml", SharedStringsTable.class ); - public static final XSSFRelation STYLES = create( + public static final XSSFRelation STYLES = new XSSFRelation( "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", "/xl/styles.xml", @@ -86,22 +84,58 @@ public final class XSSFRelation extends POIXMLRelation { "application/vnd.openxmlformats-officedocument.drawing+xml", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing", "/xl/drawings/drawing#.xml", - null + XSSFDrawing.class ); - public static final XSSFRelation VML_DRAWINGS = create( + public static final XSSFRelation VML_DRAWINGS = new XSSFRelation( "application/vnd.openxmlformats-officedocument.vmlDrawing", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing", "/xl/drawings/vmlDrawing#.vml", - Drawing.class + null ); public static final XSSFRelation IMAGES = new XSSFRelation( - //client will substitute $type and $ext with the appropriate values depending on the passed data - "image/$type", + null, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", - "/xl/media/image#.$ext", - null + null, + XSSFPictureData.class ); - public static final XSSFRelation SHEET_COMMENTS = create( + public static final XSSFRelation IMAGE_EMF = new XSSFRelation( + "image/x-emf", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", + "/xl/media/image#.emf", + XSSFPictureData.class + ); + public static final XSSFRelation IMAGE_WMF = new XSSFRelation( + "image/x-wmf", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", + "/xl/media/image#.wmf", + XSSFPictureData.class + ); + public static final XSSFRelation IMAGE_PICT = new XSSFRelation( + "image/pict", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", + "/xl/media/image#.pict", + XSSFPictureData.class + ); + public static final XSSFRelation IMAGE_JPEG = new XSSFRelation( + "image/jpeg", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", + "/xl/media/image#.jpeg", + XSSFPictureData.class + ); + public static final XSSFRelation IMAGE_PNG = new XSSFRelation( + "image/png", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", + "/xl/media/image#.png", + XSSFPictureData.class + ); + public static final XSSFRelation IMAGE_DIB = new XSSFRelation( + "image/dib", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", + "/xl/media/image#.dib", + XSSFPictureData.class + ); + + public static final XSSFRelation SHEET_COMMENTS = new XSSFRelation( "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", "/xl/comments#.xml", @@ -113,111 +147,54 @@ public final class XSSFRelation extends POIXMLRelation { null, null ); - public static final XSSFRelation OLEEMBEDDINGS = create( + public static final XSSFRelation OLEEMBEDDINGS = new XSSFRelation( null, POIXMLDocument.OLE_OBJECT_REL_TYPE, null, - BinaryPart.class + null ); - public static final XSSFRelation PACKEMBEDDINGS = create( + public static final XSSFRelation PACKEMBEDDINGS = new XSSFRelation( null, POIXMLDocument.PACK_OBJECT_REL_TYPE, null, - BinaryPart.class + null ); - public static final XSSFRelation VBA_MACROS = create( + public static final XSSFRelation VBA_MACROS = new XSSFRelation( "application/vnd.ms-office.vbaProject", "http://schemas.microsoft.com/office/2006/relationships/vbaProject", "/xl/vbaProject.bin", - BinaryPart.class + null ); - public static final XSSFRelation ACTIVEX_CONTROLS = create( + public static final XSSFRelation ACTIVEX_CONTROLS = new XSSFRelation( "application/vnd.ms-office.activeX+xml", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/control", "/xl/activeX/activeX#.xml", - Control.class + null ); - public static final XSSFRelation ACTIVEX_BINS = create( + public static final XSSFRelation ACTIVEX_BINS = new XSSFRelation( "application/vnd.ms-office.activeX", "http://schemas.microsoft.com/office/2006/relationships/activeXControlBinary", "/xl/activeX/activeX#.bin", - BinaryPart.class + null ); - public static final XSSFRelation THEME = create( + public static final XSSFRelation THEME = new XSSFRelation( "application/vnd.openxmlformats-officedocument.theme+xml", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme", "/xl/theme/theme#.xml", - ThemeTable.class + null ); - private static POILogger log = POILogFactory.getLogger(XSSFRelation.class); - - private static XSSFRelation create(String type, String rel, String defaultName, Class cls) { - return new XSSFRelation(type, rel, defaultName, cls); - } - - private Constructor _constructor; - private final boolean _constructorTakesTwoArgs; - - private XSSFRelation(String type, String rel, String defaultName, Class cls) { - super(type, rel, defaultName); - if (cls == null) { - _constructor = null; - _constructorTakesTwoArgs = false; - } else { - Constructor c; - boolean twoArg; - - // Find the right constructor - try { - c = cls.getConstructor(InputStream.class, String.class); - twoArg = true; - } catch(NoSuchMethodException e) { - try { - c = cls.getConstructor(InputStream.class); - twoArg = false; - } catch(NoSuchMethodException e2) { - throw new RuntimeException(e2); - } - } - _constructor = c; - _constructorTakesTwoArgs = twoArg; - } - } + private XSSFRelation(String type, String rel, String defaultName, Class cls) { + super(type, rel, defaultName, cls); - /** - * Does one of these exist for the given core - * package part? - */ - public boolean exists(PackagePart corePart) throws InvalidFormatException { - if(corePart == null) { - // new file, can't exist - return false; - } - - PackageRelationshipCollection prc = - corePart.getRelationshipsByType(_relation); - Iterator it = prc.iterator(); - return it.hasNext(); - } - - /** - * Returns the filename for the nth one of these, - * eg /xl/comments4.xml - */ - public String getFileName(int index) { - if(_defaultName.indexOf("#") == -1) { - // Generic filename in all cases - return getDefaultFileName(); - } - return _defaultName.replace("#", Integer.toString(index)); - } + if(cls != null && !_table.containsKey(rel)) _table.put(rel, this); + } - /** - * Fetches the InputStream to read the contents, based + /** + * Fetches the InputStream to read the contents, based * of the specified core part, for which we are defined * as a suitable relationship */ @@ -235,150 +212,16 @@ public final class XSSFRelation extends POIXMLRelation { return null; } } - - /** - * Loads all the XSSFModels of this type which are - * defined as relationships of the given parent part - */ - public List loadAll(PackagePart parentPart) throws Exception { - List found = new ArrayList(); - for(PackageRelationship rel : parentPart.getRelationshipsByType(_relation)) { - PackagePart part = XSSFWorkbook.getTargetPart(parentPart.getPackage(), rel); - found.add(create(part, rel)); - } - return found; - } - - /** - * Load a single Model, which is defined as a suitable - * relationship from the specified core (parent) - * package part. - */ - public W load(PackagePart corePart) throws Exception { - PackageRelationshipCollection prc = - corePart.getRelationshipsByType(_relation); - Iterator it = prc.iterator(); - if(it.hasNext()) { - PackageRelationship rel = it.next(); - PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI()); - PackagePart part = corePart.getPackage().getPart(relName); - return create(part, rel); - } else { - log.log(POILogger.WARN, "No part " + _defaultName + " found"); - return null; - } - } - - /** - * Does the actual Model creation - */ - private W create(PackagePart thisPart, PackageRelationship rel) - throws IOException, InvalidFormatException { - - if (_constructor == null) { - throw new IllegalStateException("Model class not set"); - } - // Instantiate, if we can - InputStream inp = thisPart.getInputStream(); - if (inp == null) { - return null; // TODO - is this valid? - } - Object[] args; - if (_constructorTakesTwoArgs) { - args = new Object[] { inp, rel.getId(), }; - } else { - args = new Object[] { inp, }; - } - W result; - try { - try { - result = _constructor.newInstance(args); - } catch (IllegalArgumentException e) { - throw new RuntimeException(e); - } catch (InstantiationException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } catch (InvocationTargetException e) { - Throwable t = e.getTargetException(); - if (t instanceof IOException) { - throw (IOException)t; - } - if (t instanceof RuntimeException) { - throw (RuntimeException)t; - } - throw new RuntimeException(t); - } - } finally { - inp.close(); - } - - // Do children, if required - if(result instanceof XSSFChildContainingModel) { - XSSFChildContainingModel ccm = - (XSSFChildContainingModel)result; - for(String relType : ccm.getChildrenRelationshipTypes()) { - for(PackageRelationship cRel : thisPart.getRelationshipsByType(relType)) { - PackagePart childPart = XSSFWorkbook.getTargetPart(thisPart.getPackage(), cRel); - ccm.generateChild(childPart, cRel.getId()); - } - } - } - - - return result; - } - - /** - * Save, with the default name - * @return The internal reference ID it was saved at, normally then used as an r:id - */ - protected String save(XSSFWritableModel model, PackagePart corePart) throws IOException { - return save(model, corePart, _defaultName); - } - /** - * Save, with the name generated by the given index - * @return The internal reference ID it was saved at, normally then used as an r:id - */ - protected String save(XSSFWritableModel model, PackagePart corePart, int index) throws IOException { - return save(model, corePart, getFileName(index)); - } - /** - * Save, with the specified name - * @return The internal reference ID it was saved at, normally then used as an r:id - */ - protected String save(XSSFWritableModel model, PackagePart corePart, String name) throws IOException { - PackagePartName ppName = null; - try { - ppName = PackagingURIHelper.createPartName(name); - } catch(InvalidFormatException e) { - throw new IllegalStateException("Can't create part with name " + name + " for " + model, e); - } - PackageRelationship rel = - corePart.addRelationship(ppName, TargetMode.INTERNAL, _relation); - PackagePart part = corePart.getPackage().createPart(ppName, _type); - - OutputStream out = part.getOutputStream(); - model.writeTo(out); - out.close(); - - // Do children, if required - if(model instanceof XSSFChildContainingModel) { - XSSFChildContainingModel ccm = - (XSSFChildContainingModel)model; - // Loop over each child, writing it out - int numChildren = ccm.getNumberOfChildren(); - for(int i=0; ihttp://schemas.openxmlformats.org/officeDocument/2006/relationships/image + * @return registered POIXMLRelation or null if not found + */ + public static XSSFRelation getInstance(String rel){ + return _table.get(rel); + } } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index 2055894a8c..127e438510 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -22,13 +22,11 @@ import java.io.OutputStream; import java.util.*; import javax.xml.namespace.QName; -import org.apache.poi.hssf.usermodel.HSSFPrintSetup; import org.apache.poi.hssf.util.PaneInformation; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CommentsSource; import org.apache.poi.ss.usermodel.Footer; import org.apache.poi.ss.usermodel.Header; -import org.apache.poi.ss.usermodel.PrintSetup; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; @@ -71,10 +69,6 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { protected CommentsSource sheetComments; protected CTMergeCells ctMergeCells; - - protected List controls; - - public static final short LeftMargin = 0; public static final short RightMargin = 1; public static final short TopMargin = 2; @@ -167,7 +161,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { public List getControls() { - return controls; + return null; } /** @@ -267,7 +261,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { if(ctDrawing == null) { //drawingNumber = #drawings.size() + 1 int drawingNumber = getPackagePart().getPackage().getPartsByRelationshipType(XSSFRelation.DRAWINGS.getRelation()).size() + 1; - drawing = (XSSFDrawing)createRelationship(XSSFRelation.DRAWINGS, XSSFDrawing.class, drawingNumber); + drawing = (XSSFDrawing)createRelationship(XSSFRelation.DRAWINGS, XSSFFactory.getInstance(), drawingNumber); String relId = drawing.getPackageRelationship().getId(); //add CT_Drawing element which indicates that this sheet contains drawing components built on the drawingML platform. @@ -632,7 +626,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { public short getLeftCol() { String cellRef = worksheet.getSheetViews().getSheetViewArray(0).getTopLeftCell(); CellReference cellReference = new CellReference(cellRef); - return (short)cellReference.getCol(); + return cellReference.getCol(); } public double getMargin(short margin) { @@ -1220,8 +1214,8 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { * @see #setZoom(int) */ public void setZoom(int numerator, int denominator) { - Float result = new Float(numerator)/new Float(denominator)*100; - setZoom(result.intValue()); + int zoom = 100*numerator/denominator; + setZoom(zoom); } /** @@ -1368,7 +1362,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { public void ungroupRow(int fromRow, int toRow) { for(int i=fromRow;i<=toRow;i++){ - XSSFRow xrow=(XSSFRow)getRow(i-1); + XSSFRow xrow=getRow(i-1); if(xrow!=null){ CTRow ctrow=xrow.getCTRow(); short outlinelevel=ctrow.getOutlineLevel(); @@ -1384,12 +1378,12 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { private void setSheetFormatPrOutlineLevelRow(){ short maxLevelRow=getMaxOutlineLevelRows(); - getSheetTypeSheetFormatPr().setOutlineLevelRow((short)(maxLevelRow)); + getSheetTypeSheetFormatPr().setOutlineLevelRow(maxLevelRow); } private void setSheetFormatPrOutlineLevelCol(){ short maxLevelCol=getMaxOutlineLevelCols(); - getSheetTypeSheetFormatPr().setOutlineLevelCol((short)(maxLevelCol)); + getSheetTypeSheetFormatPr().setOutlineLevelCol(maxLevelCol); } protected CTSheetViews getSheetTypeSheetViews() { @@ -1519,7 +1513,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { private CommentsSource getComments() { if (sheetComments == null) { - sheetComments = (CommentsTable)createRelationship(XSSFRelation.SHEET_COMMENTS, CommentsTable.class, (int)sheet.getSheetId()); + sheetComments = (CommentsTable)createRelationship(XSSFRelation.SHEET_COMMENTS, XSSFFactory.getInstance(), (int)sheet.getSheetId()); } return sheetComments; } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index bcc61660f6..8a10a266ce 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -19,14 +19,10 @@ package org.apache.poi.xssf.usermodel; import java.io.IOException; import java.io.OutputStream; -import java.io.InputStream; -import java.io.ByteArrayInputStream; import java.util.*; import javax.xml.namespace.QName; import org.apache.poi.POIXMLDocument; import org.apache.poi.POIXMLDocumentPart; -import org.apache.poi.ss.usermodel.Palette; -import org.apache.poi.ss.usermodel.PictureData; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; @@ -34,12 +30,10 @@ import org.apache.poi.ss.usermodel.Row.MissingCellPolicy; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.apache.poi.util.PackageHelper; -import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.model.*; import org.apache.poi.POIXMLException; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; -import org.openxml4j.exceptions.InvalidFormatException; import org.openxml4j.exceptions.OpenXML4JException; import org.openxml4j.opc.*; import org.openxml4j.opc.Package; @@ -131,7 +125,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable(); sheets = new LinkedList(); @@ -273,7 +267,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable