diff options
author | Yegor Kozlov <yegor@apache.org> | 2008-10-12 13:10:30 +0000 |
---|---|---|
committer | Yegor Kozlov <yegor@apache.org> | 2008-10-12 13:10:30 +0000 |
commit | e308696df9128f7eebb43fccdd57836552e3d6b6 (patch) | |
tree | 95ca3642bb8a7b273ca0de0ea21e5c83707924d9 | |
parent | bff1825f7843f2702853b9c795c43e9359f6205c (diff) | |
download | poi-e308696df9128f7eebb43fccdd57836552e3d6b6.tar.gz poi-e308696df9128f7eebb43fccdd57836552e3d6b6.zip |
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
10 files changed, 197 insertions, 335 deletions
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<? extends POIXMLDocumentPart> 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<? extends POIXMLDocumentPart> 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<? extends POIXMLDocumentPart> 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.
@@ -39,19 +39,36 @@ public class POIXMLRelation { protected String _defaultName;
/**
+ * Defines what object is used to construct instances of this relationship
+ */
+ private Class<? extends POIXMLDocumentPart> _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<? extends POIXMLDocumentPart> 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<? extends POIXMLDocumentPart> 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<String, Class> parts = new HashMap<String, Class>();
- 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<? extends POIXMLDocumentPart> 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<? extends POIXMLDocumentPart> 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<W extends XSSFModel> 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<String, XSSFRelation> _table = new HashMap<String, XSSFRelation>(); + public static final XSSFRelation WORKBOOK = new XSSFRelation( "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", @@ -68,15 +66,15 @@ public final class XSSFRelation<W extends XSSFModel> 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<SharedStringsTable> 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<StylesTable> 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<W extends XSSFModel> 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<Drawing> 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<CommentsTable> 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<W extends XSSFModel> extends POIXMLRelation { null, null ); - public static final XSSFRelation<BinaryPart> OLEEMBEDDINGS = create( + public static final XSSFRelation OLEEMBEDDINGS = new XSSFRelation( null, POIXMLDocument.OLE_OBJECT_REL_TYPE, null, - BinaryPart.class + null ); - public static final XSSFRelation<BinaryPart> PACKEMBEDDINGS = create( + public static final XSSFRelation PACKEMBEDDINGS = new XSSFRelation( null, POIXMLDocument.PACK_OBJECT_REL_TYPE, null, - BinaryPart.class + null ); - public static final XSSFRelation<BinaryPart> 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<Control> 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<BinaryPart> 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<ThemeTable> 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 <R extends XSSFModel> XSSFRelation<R> create(String type, String rel, String defaultName, Class<R> cls) { - return new XSSFRelation<R>(type, rel, defaultName, cls); - } - - private Constructor<W> _constructor; - private final boolean _constructorTakesTwoArgs; - - private XSSFRelation(String type, String rel, String defaultName, Class<W> cls) { - super(type, rel, defaultName); - if (cls == null) { - _constructor = null; - _constructorTakesTwoArgs = false; - } else { - Constructor<W> 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<? extends POIXMLDocumentPart> 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<PackageRelationship> 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<W extends XSSFModel> extends POIXMLRelation { return null; } } - - /** - * Loads all the XSSFModels of this type which are - * defined as relationships of the given parent part - */ - public List<W> loadAll(PackagePart parentPart) throws Exception { - List<W> found = new ArrayList<W>(); - 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<PackageRelationship> 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; i<numChildren; i++) { - XSSFChildContainingModel.WritableChild child = - ccm.getChildForWriting(i); - child.getRelation().save( - child.getModel(), - part, - (i+1) - ); - } - } - - return rel.getId(); - } + + + /** + * Get POIXMLRelation by relation type + * + * @param rel relation type, for example, + * <code>http://schemas.openxmlformats.org/officeDocument/2006/relationships/image</code> + * @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<Control> 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<Control> 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<X public XSSFWorkbook(Package pkg) throws IOException { super(); if(pkg.getPackageAccess() == PackageAccess.READ){ - //current implementation of OpenXML4J is funny. + //YK: current implementation of OpenXML4J is funny. //Packages opened by Package.open(InputStream is) are read-only, //there is no way to change or even save such an instance in a OutputStream. //The workaround is to create a copy via a temp file @@ -155,7 +149,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X try { //build the POIXMLDocumentPart tree, this workbook is the root - read(new XSSFFactory()); + read(XSSFFactory.getInstance()); PackagePart corePart = getCorePart(); @@ -202,7 +196,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X if(sharedStringSource == null) { //Create SST if it is missing - sharedStringSource = (SharedStringsTable)createRelationship(XSSFRelation.SHARED_STRINGS, SharedStringsTable.class); + sharedStringSource = (SharedStringsTable)createRelationship(XSSFRelation.SHARED_STRINGS, XSSFFactory.getInstance()); } // Process the named ranges @@ -240,8 +234,8 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X bv.setActiveTab(0); workbook.addNewSheets(); - sharedStringSource = (SharedStringsTable)createRelationship(XSSFRelation.SHARED_STRINGS, SharedStringsTable.class); - stylesSource = (StylesTable)createRelationship(XSSFRelation.STYLES, StylesTable.class); + sharedStringSource = (SharedStringsTable)createRelationship(XSSFRelation.SHARED_STRINGS, XSSFFactory.getInstance()); + stylesSource = (StylesTable)createRelationship(XSSFRelation.STYLES, XSSFFactory.getInstance()); namedRanges = new LinkedList<XSSFName>(); sheets = new LinkedList<XSSFSheet>(); @@ -273,7 +267,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X */ public int addPicture(byte[] pictureData, int format) { int imageNumber = getAllPictures().size() + 1; - XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFPictureData.class, imageNumber, true); + XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true); try { OutputStream out = img.getPackagePart().getOutputStream(); out.write(pictureData); @@ -392,7 +386,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X throw new IllegalArgumentException( "The workbook already contains a sheet of this name" ); int sheetNumber = getNumberOfSheets() + 1; - XSSFSheet wrapper = (XSSFSheet)createRelationship(XSSFRelation.WORKSHEET, XSSFSheet.class, sheetNumber); + XSSFSheet wrapper = (XSSFSheet)createRelationship(XSSFRelation.WORKSHEET, XSSFFactory.getInstance(), sheetNumber); CTSheet sheet = addSheet(sheetname); wrapper.sheet = sheet; @@ -496,11 +490,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X return stylesSource.getStyleAt(idx); } - public Palette getCustomPalette() { - // TODO Auto-generated method stub - return null; - } - /** * Get the font at the given index number * @@ -508,7 +497,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X * @return XSSFFont at the index */ public XSSFFont getFontAt(short idx) { - return (XSSFFont)stylesSource.getFontAt(idx); + return stylesSource.getFontAt(idx); } /** |