You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by jo...@apache.org on 2009/03/18 19:54:02 UTC

svn commit: r755699 [3/7] - in /poi/trunk/src: examples/src/org/apache/poi/xssf/eventusermodel/examples/ ooxml/java/org/apache/poi/ ooxml/java/org/apache/poi/dev/ ooxml/java/org/apache/poi/extractor/ ooxml/java/org/apache/poi/openxml4j/opc/ ooxml/java/...

Modified: poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java?rev=755699&r1=755698&r2=755699&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java Wed Mar 18 18:54:01 2009
@@ -1,654 +1,654 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.openxml4j.opc;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.openxml4j.exceptions.InvalidOperationException;
-import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
-import org.apache.poi.openxml4j.opc.internal.ContentType;
-
-/**
- * Provides a base class for parts stored in a Package.
- * 
- * @author Julien Chable
- * @version 0.9
- */
-public abstract class PackagePart implements RelationshipSource {
-
-	/**
-	 * This part's container.
-	 */
-	protected Package container;
-
-	/**
-	 * The part name. (required by the specification [M1.1])
-	 */
-	protected PackagePartName partName;
-
-	/**
-	 * The type of content of this part. (required by the specification [M1.2])
-	 */
-	protected ContentType contentType;
-
-	/**
-	 * Flag to know if this part is a relationship.
-	 */
-	private boolean isRelationshipPart;
-
-	/**
-	 * Flag to know if this part has been logically deleted.
-	 */
-	private boolean isDeleted;
-
-	/**
-	 * This part's relationships.
-	 */
-	private PackageRelationshipCollection relationships;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param pack
-	 *            Parent package.
-	 * @param partName
-	 *            The part name, relative to the parent Package root.
-	 * @param contentType
-	 *            The content type.
-	 * @throws InvalidFormatException
-	 *             If the specified URI is not valid.
-	 */
-	protected PackagePart(Package pack, PackagePartName partName,
-			ContentType contentType) throws InvalidFormatException {
-		this(pack, partName, contentType, true);
-	}
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param pack
-	 *            Parent package.
-	 * @param partName
-	 *            The part name, relative to the parent Package root.
-	 * @param contentType
-	 *            The content type.
-	 * @param loadRelationships
-	 *            Specify if the relationships will be loaded
-	 * @throws InvalidFormatException
-	 *             If the specified URI is not valid.
-	 */
-	protected PackagePart(Package pack, PackagePartName partName,
-			ContentType contentType, boolean loadRelationships)
-			throws InvalidFormatException {
-		this.partName = partName;
-		this.contentType = contentType;
-		this.container = (ZipPackage) pack;
-
-		// Check if this part is a relationship part
-		isRelationshipPart = this.partName.isRelationshipPartURI();
-
-		// Load relationships if any
-		if (loadRelationships)
-			loadRelationships();
-	}
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param pack
-	 *            Parent package.
-	 * @param partName
-	 *            The part name, relative to the parent Package root.
-	 * @param contentType
-	 *            The Multipurpose Internet Mail Extensions (MIME) content type
-	 *            of the part's data stream.
-	 */
-	public PackagePart(Package pack, PackagePartName partName,
-			String contentType) throws InvalidFormatException {
-		this(pack, partName, new ContentType(contentType));
-	}
-
-	/**
-	 * Adds an external relationship to a part (except relationships part).
-	 * 
-	 * The targets of external relationships are not subject to the same
-	 * validity checks that internal ones are, as the contents is potentially
-	 * any file, URL or similar.
-	 * 
-	 * @param target
-	 *            External target of the relationship
-	 * @param relationshipType
-	 *            Type of relationship.
-	 * @return The newly created and added relationship
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addExternalRelationship(java.lang.String,
-	 *      java.lang.String)
-	 */
-	public PackageRelationship addExternalRelationship(String target,
-			String relationshipType) {
-		return addExternalRelationship(target, relationshipType, null);
-	}
-
-	/**
-	 * Adds an external relationship to a part (except relationships part).
-	 * 
-	 * The targets of external relationships are not subject to the same
-	 * validity checks that internal ones are, as the contents is potentially
-	 * any file, URL or similar.
-	 * 
-	 * @param target
-	 *            External target of the relationship
-	 * @param relationshipType
-	 *            Type of relationship.
-	 * @param id
-	 *            Relationship unique id.
-	 * @return The newly created and added relationship
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addExternalRelationship(java.lang.String,
-	 *      java.lang.String)
-	 */
-	public PackageRelationship addExternalRelationship(String target,
-			String relationshipType, String id) {
-		if (target == null) {
-			throw new IllegalArgumentException("target");
-		}
-		if (relationshipType == null) {
-			throw new IllegalArgumentException("relationshipType");
-		}
-
-		if (relationships == null) {
-			relationships = new PackageRelationshipCollection();
-		}
-
-		URI targetURI;
-		try {
-			targetURI = new URI(target);
-		} catch (URISyntaxException e) {
-			throw new IllegalArgumentException("Invalid target - " + e);
-		}
-
-		return relationships.addRelationship(targetURI, TargetMode.EXTERNAL,
-				relationshipType, id);
-	}
-
-	/**
-	 * Add a relationship to a part (except relationships part).
-	 * 
-	 * @param targetPartName
-	 *            Name of the target part. This one must be relative to the
-	 *            source root directory of the part.
-	 * @param targetMode
-	 *            Mode [Internal|External].
-	 * @param relationshipType
-	 *            Type of relationship.
-	 * @return The newly created and added relationship
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addRelationship(org.apache.poi.openxml4j.opc.PackagePartName,
-	 *      org.apache.poi.openxml4j.opc.TargetMode, java.lang.String)
-	 */
-	public PackageRelationship addRelationship(PackagePartName targetPartName,
-			TargetMode targetMode, String relationshipType) {
-		return addRelationship(targetPartName, targetMode, relationshipType,
-				null);
-	}
-
-	/**
-	 * Add a relationship to a part (except relationships part).
-	 * <p>
-	 * Check rule M1.25: The Relationships part shall not have relationships to
-	 * any other part. Package implementers shall enforce this requirement upon
-	 * the attempt to create such a relationship and shall treat any such
-	 * relationship as invalid.
-	 * </p>
-	 * @param targetPartName
-	 *            Name of the target part. This one must be relative to the
-	 *            source root directory of the part.
-	 * @param targetMode
-	 *            Mode [Internal|External].
-	 * @param relationshipType
-	 *            Type of relationship.
-	 * @param id
-	 *            Relationship unique id.
-	 * @return The newly created and added relationship
-	 * 
-	 * @throws InvalidFormatException
-	 *             If the URI point to a relationship part URI.
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addRelationship(org.apache.poi.openxml4j.opc.PackagePartName,
-	 *      org.apache.poi.openxml4j.opc.TargetMode, java.lang.String, java.lang.String)
-	 */
-	public PackageRelationship addRelationship(PackagePartName targetPartName,
-			TargetMode targetMode, String relationshipType, String id) {
-		container.throwExceptionIfReadOnly();
-
-		if (targetPartName == null) {
-			throw new IllegalArgumentException("targetPartName");
-		}
-		if (targetMode == null) {
-			throw new IllegalArgumentException("targetMode");
-		}
-		if (relationshipType == null) {
-			throw new IllegalArgumentException("relationshipType");
-		}
-
-		if (this.isRelationshipPart || targetPartName.isRelationshipPartURI()) {
-			throw new InvalidOperationException(
-					"Rule M1.25: The Relationships part shall not have relationships to any other part.");
-		}
-
-		if (relationships == null) {
-			relationships = new PackageRelationshipCollection();
-		}
-
-		return relationships.addRelationship(targetPartName.getURI(),
-				targetMode, relationshipType, id);
-	}
-
-	/**
-	 * Add a relationship to a part (except relationships part).
-	 * 
-	 * @param targetURI
-	 *            URI the target part. Must be relative to the source root
-	 *            directory of the part.
-	 * @param targetMode
-	 *            Mode [Internal|External].
-	 * @param relationshipType
-	 *            Type of relationship.
-	 * @return The newly created and added relationship
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addRelationship(org.apache.poi.openxml4j.opc.PackagePartName,
-	 *      org.apache.poi.openxml4j.opc.TargetMode, java.lang.String)
-	 */
-	public PackageRelationship addRelationship(URI targetURI,
-			TargetMode targetMode, String relationshipType) {
-		return addRelationship(targetURI, targetMode, relationshipType, null);
-	}
-
-	/**
-	 * Add a relationship to a part (except relationships part).
-	 * <p>
-	 * Check rule M1.25: The Relationships part shall not have relationships to
-	 * any other part. Package implementers shall enforce this requirement upon
-	 * the attempt to create such a relationship and shall treat any such
-	 * relationship as invalid.
-	 * </p>
-	 * @param targetURI
-	 *            URI of the target part. Must be relative to the source root
-	 *            directory of the part.
-	 * @param targetMode
-	 *            Mode [Internal|External].
-	 * @param relationshipType
-	 *            Type of relationship.
-	 * @param id
-	 *            Relationship unique id.
-	 * @return The newly created and added relationship
-	 * 
-	 * @throws InvalidFormatException
-	 *             If the URI point to a relationship part URI.
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addRelationship(org.apache.poi.openxml4j.opc.PackagePartName,
-	 *      org.apache.poi.openxml4j.opc.TargetMode, java.lang.String, java.lang.String)
-	 */
-	public PackageRelationship addRelationship(URI targetURI,
-			TargetMode targetMode, String relationshipType, String id) {
-		container.throwExceptionIfReadOnly();
-
-		if (targetURI == null) {
-			throw new IllegalArgumentException("targetPartName");
-		}
-		if (targetMode == null) {
-			throw new IllegalArgumentException("targetMode");
-		}
-		if (relationshipType == null) {
-			throw new IllegalArgumentException("relationshipType");
-		}
-
-		// Try to retrieve the target part
-
-		if (this.isRelationshipPart
-				|| PackagingURIHelper.isRelationshipPartURI(targetURI)) {
-			throw new InvalidOperationException(
-					"Rule M1.25: The Relationships part shall not have relationships to any other part.");
-		}
-
-		if (relationships == null) {
-			relationships = new PackageRelationshipCollection();
-		}
-
-		return relationships.addRelationship(targetURI,
-				targetMode, relationshipType, id);
-	}
-
-	/**
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#clearRelationships()
-	 */
-	public void clearRelationships() {
-		if (relationships != null) {
-			relationships.clear();
-		}
-	}
-
-	/**
-	 * Delete the relationship specified by its id.
-	 * 
-	 * @param id
-	 *            The ID identified the part to delete.
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#removeRelationship(java.lang.String)
-	 */
-	public void removeRelationship(String id) {
-		this.container.throwExceptionIfReadOnly();
-		if (this.relationships != null)
-			this.relationships.removeRelationship(id);
-	}
-
-	/**
-	 * Retrieve all the relationships attached to this part.
-	 * 
-	 * @return This part's relationships.
-	 * @throws OpenXML4JException
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#getRelationships()
-	 */
-	public PackageRelationshipCollection getRelationships()
-			throws InvalidFormatException {
-		return getRelationshipsCore(null);
-	}
-
-	/**
-	 * Retrieves a package relationship from its id.
-	 * 
-	 * @param id
-	 *            ID of the package relationship to retrieve.
-	 * @return The package relationship
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#getRelationship(java.lang.String)
-	 */
-	public PackageRelationship getRelationship(String id) {
-		return this.relationships.getRelationshipByID(id);
-	}
-
-	/**
-	 * Retrieve all relationships attached to this part which have the specified
-	 * type.
-	 * 
-	 * @param relationshipType
-	 *            Relationship type filter.
-	 * @return All relationships from this part that have the specified type.
-	 * @throws InvalidFormatException
-	 *             If an error occurs while parsing the part.
-	 * @throws InvalidOperationException
-	 *             If the package is open in write only mode.
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#getRelationshipsByType(java.lang.String)
-	 */
-	public PackageRelationshipCollection getRelationshipsByType(
-			String relationshipType) throws InvalidFormatException {
-		container.throwExceptionIfWriteOnly();
-
-		return getRelationshipsCore(relationshipType);
-	}
-
-	/**
-	 * Implementation of the getRelationships method().
-	 * 
-	 * @param filter
-	 *            Relationship type filter. If <i>null</i> then the filter is
-	 *            disabled and return all the relationships.
-	 * @return All relationships from this part that have the specified type.
-	 * @throws InvalidFormatException
-	 *             Throws if an error occurs during parsing the relationships
-	 *             part.
-	 * @throws InvalidOperationException
-	 *             Throws if the package is open en write only mode.
-	 * @see #getRelationshipsByType(String)
-	 */
-	private PackageRelationshipCollection getRelationshipsCore(String filter)
-			throws InvalidFormatException {
-		this.container.throwExceptionIfWriteOnly();
-		if (relationships == null) {
-			this.throwExceptionIfRelationship();
-			relationships = new PackageRelationshipCollection(this);
-		}
-		return new PackageRelationshipCollection(relationships, filter);
-	}
-
-	/**
-	 * Knows if the part have any relationships.
-	 * 
-	 * @return <b>true</b> if the part have at least one relationship else
-	 *         <b>false</b>.
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#hasRelationships()
-	 */
-	public boolean hasRelationships() {
-		return (!this.isRelationshipPart && (relationships != null && relationships
-				.size() > 0));
-	}
-
-	/**
-	 * Checks if the specified relationship is part of this package part.
-	 * 
-	 * @param rel
-	 *            The relationship to check.
-	 * @return <b>true</b> if the specified relationship exists in this part,
-	 *         else returns <b>false</b>
-	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#isRelationshipExists(org.apache.poi.openxml4j.opc.PackageRelationship)
-	 */
-	@SuppressWarnings("finally")
-	public boolean isRelationshipExists(PackageRelationship rel) {
-		try {
-			for (PackageRelationship r : this.getRelationships()) {
-				if (r == rel)
-					return true;
-			}
-		} finally {
-			return false;
-		}
-	}
-
-	/**
-	 * Get the input stream of this part to read its content.
-	 * 
-	 * @return The input stream of the content of this part, else
-	 *         <code>null</code>.
-	 */
-	public InputStream getInputStream() throws IOException {
-		InputStream inStream = this.getInputStreamImpl();
-		if (inStream == null) {
-			throw new IOException("Can't obtain the input stream from "
-					+ partName.getName());
-		} else
-			return inStream;
-	}
-
-	/**
-	 * Get the output stream of this part. If the part is originally embedded in
-	 * Zip package, it'll be transform intot a <i>MemoryPackagePart</i> in
-	 * order to write inside (the standard Java API doesn't allow to write in
-	 * the file)
-	 * 
-	 * @see org.apache.poi.openxml4j.opc.internal.MemoryPackagePart
-	 */
-	public OutputStream getOutputStream() {
-		OutputStream outStream;
-		// If this part is a zip package part (read only by design) we convert
-		// this part into a MemoryPackagePart instance for write purpose.
-		if (this instanceof ZipPackagePart) {
-			// Delete logically this part
-			this.container.removePart(this.partName);
-
-			// Create a memory part
-			PackagePart part = container.createPart(this.partName,
-					this.contentType.toString(), false);
-			part.relationships = this.relationships;
-			if (part == null) {
-				throw new InvalidOperationException(
-						"Can't create a temporary part !");
-			}
-			outStream = part.getOutputStreamImpl();
-		} else {
-			outStream = this.getOutputStreamImpl();
-		}
-		return outStream;
-	}
-
-	/**
-	 * Throws an exception if this package part is a relationship part.
-	 * 
-	 * @throws InvalidOperationException
-	 *             If this part is a relationship part.
-	 */
-	private void throwExceptionIfRelationship()
-			throws InvalidOperationException {
-		if (this.isRelationshipPart)
-			throw new InvalidOperationException(
-					"Can do this operation on a relationship part !");
-	}
-
-	/**
-	 * Ensure the package relationships collection instance is built.
-	 * 
-	 * @throws InvalidFormatException
-	 *             Throws if
-	 */
-	private void loadRelationships() throws InvalidFormatException {
-		if (this.relationships == null && !this.isRelationshipPart) {
-			this.throwExceptionIfRelationship();
-			relationships = new PackageRelationshipCollection(this);
-		}
-	}
-
-	/*
-	 * Accessors
-	 */
-
-	/**
-	 * @return the uri
-	 */
-	public PackagePartName getPartName() {
-		return partName;
-	}
-
-	/**
-	 * @return the contentType
-	 */
-	public String getContentType() {
-		return contentType.toString();
-	}
-
-	/**
-	 * Set the content type.
-	 * 
-	 * @param contentType
-	 *            the contentType to set
-	 * 
-	 * @throws InvalidFormatException
-	 *             Throws if the content type is not valid.
-	 * @throws InvalidOperationException
-	 *             Throws if you try to change the content type whereas this
-	 *             part is already attached to a package.
-	 */
-	public void setContentType(String contentType)
-			throws InvalidFormatException {
-		if (container == null)
-			this.contentType = new ContentType(contentType);
-		else
-			throw new InvalidOperationException(
-					"You can't change the content type of a part.");
-	}
-
-	public Package getPackage() {
-		return container;
-	}
-
-	/**
-	 * @return true if this part is a relationship
-	 */
-	public boolean isRelationshipPart() {
-		return this.isRelationshipPart;
-	}
-
-	/**
-	 * @return true if this part has been logically deleted
-	 */
-	public boolean isDeleted() {
-		return isDeleted;
-	}
-
-	/**
-	 * @param isDeleted
-	 *            the isDeleted to set
-	 */
-	public void setDeleted(boolean isDeleted) {
-		this.isDeleted = isDeleted;
-	}
-
-	@Override
-	public String toString() {
-		return "Name: " + this.partName + " - Content Type: "
-				+ this.contentType.toString();
-	}
-
-	/*-------------- Abstract methods ------------- */
-
-	/**
-	 * Abtract method that get the input stream of this part.
-	 * 
-	 * @exception IOException
-	 *                Throws if an IO Exception occur in the implementation
-	 *                method.
-	 */
-	protected abstract InputStream getInputStreamImpl() throws IOException;
-
-	/**
-	 * Abstract method that get the output stream of this part.
-	 */
-	protected abstract OutputStream getOutputStreamImpl();
-
-	/**
-	 * Save the content of this part and the associated relationships part (if
-	 * this part own at least one relationship) into the specified output
-	 * stream.
-	 * 
-	 * @param zos
-	 *            Output stream to save this part.
-	 * @throws OpenXML4JException
-	 *             If any exception occur.
-	 */
-	public abstract boolean save(OutputStream zos) throws OpenXML4JException;
-
-	/**
-	 * Load the content of this part.
-	 * 
-	 * @param ios
-	 *            The input stream of the content to load.
-	 * @return <b>true</b> if the content has been successfully loaded, else
-	 *         <b>false</b>.
-	 * @throws InvalidFormatException
-	 *             Throws if the content format is invalid.
-	 */
-	public abstract boolean load(InputStream ios) throws InvalidFormatException;
-
-	/**
-	 * Close this part : flush this part, close the input stream and output
-	 * stream. After this method call, the part must be available for packaging.
-	 */
-	public abstract void close();
-
-	/**
-	 * Flush the content of this part. If the input stream and/or output stream
-	 * as in a waiting state to read or write, the must to empty their
-	 * respective buffer.
-	 */
-	public abstract void flush();
-}
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.openxml4j.opc;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.exceptions.InvalidOperationException;
+import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
+import org.apache.poi.openxml4j.opc.internal.ContentType;
+
+/**
+ * Provides a base class for parts stored in a Package.
+ * 
+ * @author Julien Chable
+ * @version 0.9
+ */
+public abstract class PackagePart implements RelationshipSource {
+
+	/**
+	 * This part's container.
+	 */
+	protected OPCPackage container;
+
+	/**
+	 * The part name. (required by the specification [M1.1])
+	 */
+	protected PackagePartName partName;
+
+	/**
+	 * The type of content of this part. (required by the specification [M1.2])
+	 */
+	protected ContentType contentType;
+
+	/**
+	 * Flag to know if this part is a relationship.
+	 */
+	private boolean isRelationshipPart;
+
+	/**
+	 * Flag to know if this part has been logically deleted.
+	 */
+	private boolean isDeleted;
+
+	/**
+	 * This part's relationships.
+	 */
+	private PackageRelationshipCollection relationships;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param pack
+	 *            Parent package.
+	 * @param partName
+	 *            The part name, relative to the parent Package root.
+	 * @param contentType
+	 *            The content type.
+	 * @throws InvalidFormatException
+	 *             If the specified URI is not valid.
+	 */
+	protected PackagePart(OPCPackage pack, PackagePartName partName,
+			ContentType contentType) throws InvalidFormatException {
+		this(pack, partName, contentType, true);
+	}
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param pack
+	 *            Parent package.
+	 * @param partName
+	 *            The part name, relative to the parent Package root.
+	 * @param contentType
+	 *            The content type.
+	 * @param loadRelationships
+	 *            Specify if the relationships will be loaded
+	 * @throws InvalidFormatException
+	 *             If the specified URI is not valid.
+	 */
+	protected PackagePart(OPCPackage pack, PackagePartName partName,
+			ContentType contentType, boolean loadRelationships)
+			throws InvalidFormatException {
+		this.partName = partName;
+		this.contentType = contentType;
+		this.container = (ZipPackage) pack; // TODO - enforcing ZipPackage here - perhaps should change constructor signature
+
+		// Check if this part is a relationship part
+		isRelationshipPart = this.partName.isRelationshipPartURI();
+
+		// Load relationships if any
+		if (loadRelationships)
+			loadRelationships();
+	}
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param pack
+	 *            Parent package.
+	 * @param partName
+	 *            The part name, relative to the parent Package root.
+	 * @param contentType
+	 *            The Multipurpose Internet Mail Extensions (MIME) content type
+	 *            of the part's data stream.
+	 */
+	public PackagePart(OPCPackage pack, PackagePartName partName,
+			String contentType) throws InvalidFormatException {
+		this(pack, partName, new ContentType(contentType));
+	}
+
+	/**
+	 * Adds an external relationship to a part (except relationships part).
+	 * 
+	 * The targets of external relationships are not subject to the same
+	 * validity checks that internal ones are, as the contents is potentially
+	 * any file, URL or similar.
+	 * 
+	 * @param target
+	 *            External target of the relationship
+	 * @param relationshipType
+	 *            Type of relationship.
+	 * @return The newly created and added relationship
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addExternalRelationship(java.lang.String,
+	 *      java.lang.String)
+	 */
+	public PackageRelationship addExternalRelationship(String target,
+			String relationshipType) {
+		return addExternalRelationship(target, relationshipType, null);
+	}
+
+	/**
+	 * Adds an external relationship to a part (except relationships part).
+	 * 
+	 * The targets of external relationships are not subject to the same
+	 * validity checks that internal ones are, as the contents is potentially
+	 * any file, URL or similar.
+	 * 
+	 * @param target
+	 *            External target of the relationship
+	 * @param relationshipType
+	 *            Type of relationship.
+	 * @param id
+	 *            Relationship unique id.
+	 * @return The newly created and added relationship
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addExternalRelationship(java.lang.String,
+	 *      java.lang.String)
+	 */
+	public PackageRelationship addExternalRelationship(String target,
+			String relationshipType, String id) {
+		if (target == null) {
+			throw new IllegalArgumentException("target");
+		}
+		if (relationshipType == null) {
+			throw new IllegalArgumentException("relationshipType");
+		}
+
+		if (relationships == null) {
+			relationships = new PackageRelationshipCollection();
+		}
+
+		URI targetURI;
+		try {
+			targetURI = new URI(target);
+		} catch (URISyntaxException e) {
+			throw new IllegalArgumentException("Invalid target - " + e);
+		}
+
+		return relationships.addRelationship(targetURI, TargetMode.EXTERNAL,
+				relationshipType, id);
+	}
+
+	/**
+	 * Add a relationship to a part (except relationships part).
+	 * 
+	 * @param targetPartName
+	 *            Name of the target part. This one must be relative to the
+	 *            source root directory of the part.
+	 * @param targetMode
+	 *            Mode [Internal|External].
+	 * @param relationshipType
+	 *            Type of relationship.
+	 * @return The newly created and added relationship
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addRelationship(org.apache.poi.openxml4j.opc.PackagePartName,
+	 *      org.apache.poi.openxml4j.opc.TargetMode, java.lang.String)
+	 */
+	public PackageRelationship addRelationship(PackagePartName targetPartName,
+			TargetMode targetMode, String relationshipType) {
+		return addRelationship(targetPartName, targetMode, relationshipType,
+				null);
+	}
+
+	/**
+	 * Add a relationship to a part (except relationships part).
+	 * <p>
+	 * Check rule M1.25: The Relationships part shall not have relationships to
+	 * any other part. Package implementers shall enforce this requirement upon
+	 * the attempt to create such a relationship and shall treat any such
+	 * relationship as invalid.
+	 * </p>
+	 * @param targetPartName
+	 *            Name of the target part. This one must be relative to the
+	 *            source root directory of the part.
+	 * @param targetMode
+	 *            Mode [Internal|External].
+	 * @param relationshipType
+	 *            Type of relationship.
+	 * @param id
+	 *            Relationship unique id.
+	 * @return The newly created and added relationship
+	 * 
+	 * @throws InvalidFormatException
+	 *             If the URI point to a relationship part URI.
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addRelationship(org.apache.poi.openxml4j.opc.PackagePartName,
+	 *      org.apache.poi.openxml4j.opc.TargetMode, java.lang.String, java.lang.String)
+	 */
+	public PackageRelationship addRelationship(PackagePartName targetPartName,
+			TargetMode targetMode, String relationshipType, String id) {
+		container.throwExceptionIfReadOnly();
+
+		if (targetPartName == null) {
+			throw new IllegalArgumentException("targetPartName");
+		}
+		if (targetMode == null) {
+			throw new IllegalArgumentException("targetMode");
+		}
+		if (relationshipType == null) {
+			throw new IllegalArgumentException("relationshipType");
+		}
+
+		if (this.isRelationshipPart || targetPartName.isRelationshipPartURI()) {
+			throw new InvalidOperationException(
+					"Rule M1.25: The Relationships part shall not have relationships to any other part.");
+		}
+
+		if (relationships == null) {
+			relationships = new PackageRelationshipCollection();
+		}
+
+		return relationships.addRelationship(targetPartName.getURI(),
+				targetMode, relationshipType, id);
+	}
+
+	/**
+	 * Add a relationship to a part (except relationships part).
+	 * 
+	 * @param targetURI
+	 *            URI the target part. Must be relative to the source root
+	 *            directory of the part.
+	 * @param targetMode
+	 *            Mode [Internal|External].
+	 * @param relationshipType
+	 *            Type of relationship.
+	 * @return The newly created and added relationship
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addRelationship(org.apache.poi.openxml4j.opc.PackagePartName,
+	 *      org.apache.poi.openxml4j.opc.TargetMode, java.lang.String)
+	 */
+	public PackageRelationship addRelationship(URI targetURI,
+			TargetMode targetMode, String relationshipType) {
+		return addRelationship(targetURI, targetMode, relationshipType, null);
+	}
+
+	/**
+	 * Add a relationship to a part (except relationships part).
+	 * <p>
+	 * Check rule M1.25: The Relationships part shall not have relationships to
+	 * any other part. Package implementers shall enforce this requirement upon
+	 * the attempt to create such a relationship and shall treat any such
+	 * relationship as invalid.
+	 * </p>
+	 * @param targetURI
+	 *            URI of the target part. Must be relative to the source root
+	 *            directory of the part.
+	 * @param targetMode
+	 *            Mode [Internal|External].
+	 * @param relationshipType
+	 *            Type of relationship.
+	 * @param id
+	 *            Relationship unique id.
+	 * @return The newly created and added relationship
+	 * 
+	 * @throws InvalidFormatException
+	 *             If the URI point to a relationship part URI.
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#addRelationship(org.apache.poi.openxml4j.opc.PackagePartName,
+	 *      org.apache.poi.openxml4j.opc.TargetMode, java.lang.String, java.lang.String)
+	 */
+	public PackageRelationship addRelationship(URI targetURI,
+			TargetMode targetMode, String relationshipType, String id) {
+		container.throwExceptionIfReadOnly();
+
+		if (targetURI == null) {
+			throw new IllegalArgumentException("targetPartName");
+		}
+		if (targetMode == null) {
+			throw new IllegalArgumentException("targetMode");
+		}
+		if (relationshipType == null) {
+			throw new IllegalArgumentException("relationshipType");
+		}
+
+		// Try to retrieve the target part
+
+		if (this.isRelationshipPart
+				|| PackagingURIHelper.isRelationshipPartURI(targetURI)) {
+			throw new InvalidOperationException(
+					"Rule M1.25: The Relationships part shall not have relationships to any other part.");
+		}
+
+		if (relationships == null) {
+			relationships = new PackageRelationshipCollection();
+		}
+
+		return relationships.addRelationship(targetURI,
+				targetMode, relationshipType, id);
+	}
+
+	/**
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#clearRelationships()
+	 */
+	public void clearRelationships() {
+		if (relationships != null) {
+			relationships.clear();
+		}
+	}
+
+	/**
+	 * Delete the relationship specified by its id.
+	 * 
+	 * @param id
+	 *            The ID identified the part to delete.
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#removeRelationship(java.lang.String)
+	 */
+	public void removeRelationship(String id) {
+		this.container.throwExceptionIfReadOnly();
+		if (this.relationships != null)
+			this.relationships.removeRelationship(id);
+	}
+
+	/**
+	 * Retrieve all the relationships attached to this part.
+	 * 
+	 * @return This part's relationships.
+	 * @throws OpenXML4JException
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#getRelationships()
+	 */
+	public PackageRelationshipCollection getRelationships()
+			throws InvalidFormatException {
+		return getRelationshipsCore(null);
+	}
+
+	/**
+	 * Retrieves a package relationship from its id.
+	 * 
+	 * @param id
+	 *            ID of the package relationship to retrieve.
+	 * @return The package relationship
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#getRelationship(java.lang.String)
+	 */
+	public PackageRelationship getRelationship(String id) {
+		return this.relationships.getRelationshipByID(id);
+	}
+
+	/**
+	 * Retrieve all relationships attached to this part which have the specified
+	 * type.
+	 * 
+	 * @param relationshipType
+	 *            Relationship type filter.
+	 * @return All relationships from this part that have the specified type.
+	 * @throws InvalidFormatException
+	 *             If an error occurs while parsing the part.
+	 * @throws InvalidOperationException
+	 *             If the package is open in write only mode.
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#getRelationshipsByType(java.lang.String)
+	 */
+	public PackageRelationshipCollection getRelationshipsByType(
+			String relationshipType) throws InvalidFormatException {
+		container.throwExceptionIfWriteOnly();
+
+		return getRelationshipsCore(relationshipType);
+	}
+
+	/**
+	 * Implementation of the getRelationships method().
+	 * 
+	 * @param filter
+	 *            Relationship type filter. If <i>null</i> then the filter is
+	 *            disabled and return all the relationships.
+	 * @return All relationships from this part that have the specified type.
+	 * @throws InvalidFormatException
+	 *             Throws if an error occurs during parsing the relationships
+	 *             part.
+	 * @throws InvalidOperationException
+	 *             Throws if the package is open en write only mode.
+	 * @see #getRelationshipsByType(String)
+	 */
+	private PackageRelationshipCollection getRelationshipsCore(String filter)
+			throws InvalidFormatException {
+		this.container.throwExceptionIfWriteOnly();
+		if (relationships == null) {
+			this.throwExceptionIfRelationship();
+			relationships = new PackageRelationshipCollection(this);
+		}
+		return new PackageRelationshipCollection(relationships, filter);
+	}
+
+	/**
+	 * Knows if the part have any relationships.
+	 * 
+	 * @return <b>true</b> if the part have at least one relationship else
+	 *         <b>false</b>.
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#hasRelationships()
+	 */
+	public boolean hasRelationships() {
+		return (!this.isRelationshipPart && (relationships != null && relationships
+				.size() > 0));
+	}
+
+	/**
+	 * Checks if the specified relationship is part of this package part.
+	 * 
+	 * @param rel
+	 *            The relationship to check.
+	 * @return <b>true</b> if the specified relationship exists in this part,
+	 *         else returns <b>false</b>
+	 * @see org.apache.poi.openxml4j.opc.RelationshipSource#isRelationshipExists(org.apache.poi.openxml4j.opc.PackageRelationship)
+	 */
+	@SuppressWarnings("finally")
+	public boolean isRelationshipExists(PackageRelationship rel) {
+		try {
+			for (PackageRelationship r : this.getRelationships()) {
+				if (r == rel)
+					return true;
+			}
+		} finally {
+			return false;
+		}
+	}
+
+	/**
+	 * Get the input stream of this part to read its content.
+	 * 
+	 * @return The input stream of the content of this part, else
+	 *         <code>null</code>.
+	 */
+	public InputStream getInputStream() throws IOException {
+		InputStream inStream = this.getInputStreamImpl();
+		if (inStream == null) {
+			throw new IOException("Can't obtain the input stream from "
+					+ partName.getName());
+		} else
+			return inStream;
+	}
+
+	/**
+	 * Get the output stream of this part. If the part is originally embedded in
+	 * Zip package, it'll be transform intot a <i>MemoryPackagePart</i> in
+	 * order to write inside (the standard Java API doesn't allow to write in
+	 * the file)
+	 * 
+	 * @see org.apache.poi.openxml4j.opc.internal.MemoryPackagePart
+	 */
+	public OutputStream getOutputStream() {
+		OutputStream outStream;
+		// If this part is a zip package part (read only by design) we convert
+		// this part into a MemoryPackagePart instance for write purpose.
+		if (this instanceof ZipPackagePart) {
+			// Delete logically this part
+			this.container.removePart(this.partName);
+
+			// Create a memory part
+			PackagePart part = container.createPart(this.partName,
+					this.contentType.toString(), false);
+			part.relationships = this.relationships;
+			if (part == null) {
+				throw new InvalidOperationException(
+						"Can't create a temporary part !");
+			}
+			outStream = part.getOutputStreamImpl();
+		} else {
+			outStream = this.getOutputStreamImpl();
+		}
+		return outStream;
+	}
+
+	/**
+	 * Throws an exception if this package part is a relationship part.
+	 * 
+	 * @throws InvalidOperationException
+	 *             If this part is a relationship part.
+	 */
+	private void throwExceptionIfRelationship()
+			throws InvalidOperationException {
+		if (this.isRelationshipPart)
+			throw new InvalidOperationException(
+					"Can do this operation on a relationship part !");
+	}
+
+	/**
+	 * Ensure the package relationships collection instance is built.
+	 * 
+	 * @throws InvalidFormatException
+	 *             Throws if
+	 */
+	private void loadRelationships() throws InvalidFormatException {
+		if (this.relationships == null && !this.isRelationshipPart) {
+			this.throwExceptionIfRelationship();
+			relationships = new PackageRelationshipCollection(this);
+		}
+	}
+
+	/*
+	 * Accessors
+	 */
+
+	/**
+	 * @return the uri
+	 */
+	public PackagePartName getPartName() {
+		return partName;
+	}
+
+	/**
+	 * @return the contentType
+	 */
+	public String getContentType() {
+		return contentType.toString();
+	}
+
+	/**
+	 * Set the content type.
+	 * 
+	 * @param contentType
+	 *            the contentType to set
+	 * 
+	 * @throws InvalidFormatException
+	 *             Throws if the content type is not valid.
+	 * @throws InvalidOperationException
+	 *             Throws if you try to change the content type whereas this
+	 *             part is already attached to a package.
+	 */
+	public void setContentType(String contentType)
+			throws InvalidFormatException {
+		if (container == null)
+			this.contentType = new ContentType(contentType);
+		else
+			throw new InvalidOperationException(
+					"You can't change the content type of a part.");
+	}
+
+	public OPCPackage getPackage() {
+		return container;
+	}
+
+	/**
+	 * @return true if this part is a relationship
+	 */
+	public boolean isRelationshipPart() {
+		return this.isRelationshipPart;
+	}
+
+	/**
+	 * @return true if this part has been logically deleted
+	 */
+	public boolean isDeleted() {
+		return isDeleted;
+	}
+
+	/**
+	 * @param isDeleted
+	 *            the isDeleted to set
+	 */
+	public void setDeleted(boolean isDeleted) {
+		this.isDeleted = isDeleted;
+	}
+
+	@Override
+	public String toString() {
+		return "Name: " + this.partName + " - Content Type: "
+				+ this.contentType.toString();
+	}
+
+	/*-------------- Abstract methods ------------- */
+
+	/**
+	 * Abtract method that get the input stream of this part.
+	 * 
+	 * @exception IOException
+	 *                Throws if an IO Exception occur in the implementation
+	 *                method.
+	 */
+	protected abstract InputStream getInputStreamImpl() throws IOException;
+
+	/**
+	 * Abstract method that get the output stream of this part.
+	 */
+	protected abstract OutputStream getOutputStreamImpl();
+
+	/**
+	 * Save the content of this part and the associated relationships part (if
+	 * this part own at least one relationship) into the specified output
+	 * stream.
+	 * 
+	 * @param zos
+	 *            Output stream to save this part.
+	 * @throws OpenXML4JException
+	 *             If any exception occur.
+	 */
+	public abstract boolean save(OutputStream zos) throws OpenXML4JException;
+
+	/**
+	 * Load the content of this part.
+	 * 
+	 * @param ios
+	 *            The input stream of the content to load.
+	 * @return <b>true</b> if the content has been successfully loaded, else
+	 *         <b>false</b>.
+	 * @throws InvalidFormatException
+	 *             Throws if the content format is invalid.
+	 */
+	public abstract boolean load(InputStream ios) throws InvalidFormatException;
+
+	/**
+	 * Close this part : flush this part, close the input stream and output
+	 * stream. After this method call, the part must be available for packaging.
+	 */
+	public abstract void close();
+
+	/**
+	 * Flush the content of this part. If the input stream and/or output stream
+	 * as in a waiting state to read or write, the must to empty their
+	 * respective buffer.
+	 */
+	public abstract void flush();
+}

Modified: poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageProperties.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageProperties.java?rev=755699&r1=755698&r2=755699&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageProperties.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageProperties.java Wed Mar 18 18:54:01 2009
@@ -1,227 +1,227 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.openxml4j.opc;
-
-import java.util.Date;
-
-import org.apache.poi.openxml4j.util.Nullable;
-
-/**
- * Represents the core properties of an OPC package.
- * 
- * @author Julien Chable
- * @version 1.0
- * @see org.apache.poi.openxml4j.opc.Package
- */
-public interface PackageProperties {
-	
-	/**
-	 * Dublin Core Terms URI.
-	 */
-	public final static String NAMESPACE_DCTERMS = "http://purl.org/dc/terms/";
-	
-	/**
-	 * Dublin Core namespace URI.
-	 */
-	public final static String NAMESPACE_DC = "http://purl.org/dc/elements/1.1/";
-
-	/* Getters and setters */
-
-	/**
-	 * Set the category of the content of this package.
-	 */
-	public abstract Nullable<String> getCategoryProperty();
-
-	/**
-	 * Set the category of the content of this package.
-	 */
-	public abstract void setCategoryProperty(String category);
-
-	/**
-	 * Set the status of the content.
-	 */
-	public abstract Nullable<String> getContentStatusProperty();
-
-	/**
-	 * Get the status of the content.
-	 */
-	public abstract void setContentStatusProperty(String contentStatus);
-
-	/**
-	 * Get the type of content represented, generally defined by a specific use
-	 * and intended audience.
-	 */
-	public abstract Nullable<String> getContentTypeProperty();
-
-	/**
-	 * Set the type of content represented, generally defined by a specific use
-	 * and intended audience.
-	 */
-	public abstract void setContentTypeProperty(String contentType);
-
-	/**
-	 * Get the date of creation of the resource.
-	 */
-	public abstract Nullable<Date> getCreatedProperty();
-
-	/**
-	 * Set the date of creation of the resource.
-	 */
-	public abstract void setCreatedProperty(String created);
-	
-	/**
-	 * Set the date of creation of the resource.
-	 */
-	public abstract void setCreatedProperty(Nullable<Date> created);
-
-	/**
-	 * Get the entity primarily responsible for making the content of the
-	 * resource.
-	 */
-	public abstract Nullable<String> getCreatorProperty();
-
-	/**
-	 * Set the entity primarily responsible for making the content of the
-	 * resource.
-	 */
-	public abstract void setCreatorProperty(String creator);
-
-	/**
-	 * Get the explanation of the content of the resource.
-	 */
-	public abstract Nullable<String> getDescriptionProperty();
-
-	/**
-	 * Set the explanation of the content of the resource.
-	 */
-	public abstract void setDescriptionProperty(String description);
-
-	/**
-	 * Get an unambiguous reference to the resource within a given context.
-	 */
-	public abstract Nullable<String> getIdentifierProperty();
-
-	/**
-	 * Set an unambiguous reference to the resource within a given context.
-	 */
-	public abstract void setIdentifierProperty(String identifier);
-
-	/**
-	 * Get a delimited set of keywords to support searching and indexing. This
-	 * is typically a list of terms that are not available elsewhere in the
-	 * properties
-	 */
-	public abstract Nullable<String> getKeywordsProperty();
-
-	/**
-	 * Set a delimited set of keywords to support searching and indexing. This
-	 * is typically a list of terms that are not available elsewhere in the
-	 * properties
-	 */
-	public abstract void setKeywordsProperty(String keywords);
-
-	/**
-	 * Get the language of the intellectual content of the resource.
-	 */
-	public abstract Nullable<String> getLanguageProperty();
-
-	/**
-	 * Set the language of the intellectual content of the resource.
-	 */
-	public abstract void setLanguageProperty(String language);
-
-	/**
-	 * Get the user who performed the last modification.
-	 */
-	public abstract Nullable<String> getLastModifiedByProperty();
-
-	/**
-	 * Set the user who performed the last modification.
-	 */
-	public abstract void setLastModifiedByProperty(String lastModifiedBy);
-
-	/**
-	 * Get the date and time of the last printing.
-	 */
-	public abstract Nullable<Date> getLastPrintedProperty();
-
-	/**
-	 * Set the date and time of the last printing.
-	 */
-	public abstract void setLastPrintedProperty(String lastPrinted);
-	
-	/**
-	 * Set the date and time of the last printing.
-	 */
-	public abstract void setLastPrintedProperty(Nullable<Date> lastPrinted);
-
-	/**
-	 * Get the date on which the resource was changed.
-	 */
-	public abstract Nullable<Date> getModifiedProperty();
-
-	/**
-	 * Set the date on which the resource was changed.
-	 */
-	public abstract void setModifiedProperty(String modified);
-	
-	/**
-	 * Set the date on which the resource was changed.
-	 */
-	public abstract void setModifiedProperty(Nullable<Date> modified);
-
-	/**
-	 * Get the revision number.
-	 */
-	public abstract Nullable<String> getRevisionProperty();
-
-	/**
-	 * Set the revision number.
-	 */
-	public abstract void setRevisionProperty(String revision);
-
-	/**
-	 * Get the topic of the content of the resource.
-	 */
-	public abstract Nullable<String> getSubjectProperty();
-
-	/**
-	 * Set the topic of the content of the resource.
-	 */
-	public abstract void setSubjectProperty(String subject);
-
-	/**
-	 * Get the name given to the resource.
-	 */
-	public abstract Nullable<String> getTitleProperty();
-
-	/**
-	 * Set the name given to the resource.
-	 */
-	public abstract void setTitleProperty(String title);
-
-	/**
-	 * Get the version number.
-	 */
-	public abstract Nullable<String> getVersionProperty();
-
-	/**
-	 * Set the version number.
-	 */
-	public abstract void setVersionProperty(String version);
-}
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.openxml4j.opc;
+
+import java.util.Date;
+
+import org.apache.poi.openxml4j.util.Nullable;
+
+/**
+ * Represents the core properties of an OPC package.
+ * 
+ * @author Julien Chable
+ * @version 1.0
+ * @see org.apache.poi.openxml4j.opc.OPCPackage
+ */
+public interface PackageProperties {
+	
+	/**
+	 * Dublin Core Terms URI.
+	 */
+	public final static String NAMESPACE_DCTERMS = "http://purl.org/dc/terms/";
+	
+	/**
+	 * Dublin Core namespace URI.
+	 */
+	public final static String NAMESPACE_DC = "http://purl.org/dc/elements/1.1/";
+
+	/* Getters and setters */
+
+	/**
+	 * Set the category of the content of this package.
+	 */
+	public abstract Nullable<String> getCategoryProperty();
+
+	/**
+	 * Set the category of the content of this package.
+	 */
+	public abstract void setCategoryProperty(String category);
+
+	/**
+	 * Set the status of the content.
+	 */
+	public abstract Nullable<String> getContentStatusProperty();
+
+	/**
+	 * Get the status of the content.
+	 */
+	public abstract void setContentStatusProperty(String contentStatus);
+
+	/**
+	 * Get the type of content represented, generally defined by a specific use
+	 * and intended audience.
+	 */
+	public abstract Nullable<String> getContentTypeProperty();
+
+	/**
+	 * Set the type of content represented, generally defined by a specific use
+	 * and intended audience.
+	 */
+	public abstract void setContentTypeProperty(String contentType);
+
+	/**
+	 * Get the date of creation of the resource.
+	 */
+	public abstract Nullable<Date> getCreatedProperty();
+
+	/**
+	 * Set the date of creation of the resource.
+	 */
+	public abstract void setCreatedProperty(String created);
+	
+	/**
+	 * Set the date of creation of the resource.
+	 */
+	public abstract void setCreatedProperty(Nullable<Date> created);
+
+	/**
+	 * Get the entity primarily responsible for making the content of the
+	 * resource.
+	 */
+	public abstract Nullable<String> getCreatorProperty();
+
+	/**
+	 * Set the entity primarily responsible for making the content of the
+	 * resource.
+	 */
+	public abstract void setCreatorProperty(String creator);
+
+	/**
+	 * Get the explanation of the content of the resource.
+	 */
+	public abstract Nullable<String> getDescriptionProperty();
+
+	/**
+	 * Set the explanation of the content of the resource.
+	 */
+	public abstract void setDescriptionProperty(String description);
+
+	/**
+	 * Get an unambiguous reference to the resource within a given context.
+	 */
+	public abstract Nullable<String> getIdentifierProperty();
+
+	/**
+	 * Set an unambiguous reference to the resource within a given context.
+	 */
+	public abstract void setIdentifierProperty(String identifier);
+
+	/**
+	 * Get a delimited set of keywords to support searching and indexing. This
+	 * is typically a list of terms that are not available elsewhere in the
+	 * properties
+	 */
+	public abstract Nullable<String> getKeywordsProperty();
+
+	/**
+	 * Set a delimited set of keywords to support searching and indexing. This
+	 * is typically a list of terms that are not available elsewhere in the
+	 * properties
+	 */
+	public abstract void setKeywordsProperty(String keywords);
+
+	/**
+	 * Get the language of the intellectual content of the resource.
+	 */
+	public abstract Nullable<String> getLanguageProperty();
+
+	/**
+	 * Set the language of the intellectual content of the resource.
+	 */
+	public abstract void setLanguageProperty(String language);
+
+	/**
+	 * Get the user who performed the last modification.
+	 */
+	public abstract Nullable<String> getLastModifiedByProperty();
+
+	/**
+	 * Set the user who performed the last modification.
+	 */
+	public abstract void setLastModifiedByProperty(String lastModifiedBy);
+
+	/**
+	 * Get the date and time of the last printing.
+	 */
+	public abstract Nullable<Date> getLastPrintedProperty();
+
+	/**
+	 * Set the date and time of the last printing.
+	 */
+	public abstract void setLastPrintedProperty(String lastPrinted);
+	
+	/**
+	 * Set the date and time of the last printing.
+	 */
+	public abstract void setLastPrintedProperty(Nullable<Date> lastPrinted);
+
+	/**
+	 * Get the date on which the resource was changed.
+	 */
+	public abstract Nullable<Date> getModifiedProperty();
+
+	/**
+	 * Set the date on which the resource was changed.
+	 */
+	public abstract void setModifiedProperty(String modified);
+	
+	/**
+	 * Set the date on which the resource was changed.
+	 */
+	public abstract void setModifiedProperty(Nullable<Date> modified);
+
+	/**
+	 * Get the revision number.
+	 */
+	public abstract Nullable<String> getRevisionProperty();
+
+	/**
+	 * Set the revision number.
+	 */
+	public abstract void setRevisionProperty(String revision);
+
+	/**
+	 * Get the topic of the content of the resource.
+	 */
+	public abstract Nullable<String> getSubjectProperty();
+
+	/**
+	 * Set the topic of the content of the resource.
+	 */
+	public abstract void setSubjectProperty(String subject);
+
+	/**
+	 * Get the name given to the resource.
+	 */
+	public abstract Nullable<String> getTitleProperty();
+
+	/**
+	 * Set the name given to the resource.
+	 */
+	public abstract void setTitleProperty(String title);
+
+	/**
+	 * Get the version number.
+	 */
+	public abstract Nullable<String> getVersionProperty();
+
+	/**
+	 * Set the version number.
+	 */
+	public abstract void setVersionProperty(String version);
+}

Modified: poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java?rev=755699&r1=755698&r2=755699&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java Wed Mar 18 18:54:01 2009
@@ -1,227 +1,227 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.openxml4j.opc;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-/**
- * A part relationship.
- * 
- * @author Julien Chable
- * @version 1.0
- */
-public final class PackageRelationship {
-
-	private static URI containerRelationshipPart;
-
-	static {
-		try {
-			containerRelationshipPart = new URI("/_rels/.rels");
-		} catch (URISyntaxException e) {
-			// Do nothing
-		}
-	}
-
-	/* XML markup */
-
-	public static final String ID_ATTRIBUTE_NAME = "Id";
-
-	public static final String RELATIONSHIPS_TAG_NAME = "Relationships";
-
-	public static final String RELATIONSHIP_TAG_NAME = "Relationship";
-
-	public static final String TARGET_ATTRIBUTE_NAME = "Target";
-
-	public static final String TARGET_MODE_ATTRIBUTE_NAME = "TargetMode";
-
-	public static final String TYPE_ATTRIBUTE_NAME = "Type";
-
-	/* End XML markup */
-
-	/**
-	 * L'ID de la relation.
-	 */
-	private String id;
-
-	/**
-	 * Reference to the package.
-	 */
-	private Package container;
-
-	/**
-	 * Type de relation.
-	 */
-	private String relationshipType;
-
-	/**
-	 * Partie source de cette relation.
-	 */
-	private PackagePart source;
-
-	/**
-	 * Le mode de ciblage [Internal|External]
-	 */
-	private TargetMode targetMode;
-
-	/**
-	 * URI de la partie cible.
-	 */
-	private URI targetUri;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param pkg
-	 * @param sourcePart
-	 * @param targetUri
-	 * @param targetMode
-	 * @param relationshipType
-	 * @param id
-	 */
-	public PackageRelationship(Package pkg, PackagePart sourcePart,
-			URI targetUri, TargetMode targetMode, String relationshipType,
-			String id) {
-		if (pkg == null)
-			throw new IllegalArgumentException("pkg");
-		if (targetUri == null)
-			throw new IllegalArgumentException("targetUri");
-		if (relationshipType == null)
-			throw new IllegalArgumentException("relationshipType");
-		if (id == null)
-			throw new IllegalArgumentException("id");
-
-		this.container = pkg;
-		this.source = sourcePart;
-		this.targetUri = targetUri;
-		this.targetMode = targetMode;
-		this.relationshipType = relationshipType;
-		this.id = id;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (!(obj instanceof PackageRelationship)) {
-			return false;
-		}
-		PackageRelationship rel = (PackageRelationship) obj;
-		return (this.id == rel.id
-				&& this.relationshipType == rel.relationshipType
-				&& (rel.source != null ? rel.source.equals(this.source) : true)
-				&& this.targetMode == rel.targetMode && this.targetUri
-				.equals(rel.targetUri));
-	}
-
-	@Override
-	public int hashCode() {
-		return this.id.hashCode() + this.relationshipType.hashCode()
-				+ this.source.hashCode() + this.targetMode.hashCode()
-				+ this.targetUri.hashCode();
-	}
-
-	/* Getters */
-
-	public URI getContainerPartRelationship() {
-		return containerRelationshipPart;
-	}
-
-	/**
-	 * @return the container
-	 */
-	public Package getPackage() {
-		return container;
-	}
-
-	/**
-	 * @return the id
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * @return the relationshipType
-	 */
-	public String getRelationshipType() {
-		return relationshipType;
-	}
-
-	/**
-	 * @return the source
-	 */
-	public PackagePart getSource() {
-		return source;
-	}
-
-	/**
-	 * 
-	 * @return URL of the source part of this relationship
-	 */
-	public URI getSourceURI() {
-		if (source == null) {
-			return PackagingURIHelper.PACKAGE_ROOT_URI;
-		}
-		return source.partName.getURI();
-	}
-
-	/**
-	 * public URI getSourceUri(){ }
-	 * 
-	 * @return the targetMode
-	 */
-	public TargetMode getTargetMode() {
-		return targetMode;
-	}
-
-	/**
-	 * @return the targetUri
-	 */
-	public URI getTargetURI() {
-		// If it's an external target, we don't
-		//  need to apply our normal validation rules
-		if(targetMode == TargetMode.EXTERNAL) {
-			return targetUri;
-		}
-		
-		// Internal target
-		// If it isn't absolute, resolve it relative
-		//  to ourselves
-		if (!targetUri.toASCIIString().startsWith("/")) {
-			// So it's a relative part name, try to resolve it
-			return PackagingURIHelper.resolvePartUri(getSourceURI(), targetUri);
-		}
-		return targetUri;
-	}
-
-	@Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		sb.append(id == null ? "id=null" : "id=" + id);
-		sb.append(container == null ? " - container=null" : " - container="
-				+ container.toString());
-		sb.append(relationshipType == null ? " - relationshipType=null"
-				: " - relationshipType=" + relationshipType.toString());
-		sb.append(source == null ? " - source=null" : " - source="
-				+ getSourceURI().toASCIIString());
-		sb.append(targetUri == null ? " - target=null" : " - target="
-				+ getTargetURI().toASCIIString());
-		sb.append(targetMode == null ? ",targetMode=null" : ",targetMode="
-				+ targetMode.toString());
-		return sb.toString();
-	}
-}
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.openxml4j.opc;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * A part relationship.
+ * 
+ * @author Julien Chable
+ * @version 1.0
+ */
+public final class PackageRelationship {
+
+	private static URI containerRelationshipPart;
+
+	static {
+		try {
+			containerRelationshipPart = new URI("/_rels/.rels");
+		} catch (URISyntaxException e) {
+			// Do nothing
+		}
+	}
+
+	/* XML markup */
+
+	public static final String ID_ATTRIBUTE_NAME = "Id";
+
+	public static final String RELATIONSHIPS_TAG_NAME = "Relationships";
+
+	public static final String RELATIONSHIP_TAG_NAME = "Relationship";
+
+	public static final String TARGET_ATTRIBUTE_NAME = "Target";
+
+	public static final String TARGET_MODE_ATTRIBUTE_NAME = "TargetMode";
+
+	public static final String TYPE_ATTRIBUTE_NAME = "Type";
+
+	/* End XML markup */
+
+	/**
+	 * L'ID de la relation.
+	 */
+	private String id;
+
+	/**
+	 * Reference to the package.
+	 */
+	private OPCPackage container;
+
+	/**
+	 * Type de relation.
+	 */
+	private String relationshipType;
+
+	/**
+	 * Partie source de cette relation.
+	 */
+	private PackagePart source;
+
+	/**
+	 * Le mode de ciblage [Internal|External]
+	 */
+	private TargetMode targetMode;
+
+	/**
+	 * URI de la partie cible.
+	 */
+	private URI targetUri;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param pkg
+	 * @param sourcePart
+	 * @param targetUri
+	 * @param targetMode
+	 * @param relationshipType
+	 * @param id
+	 */
+	public PackageRelationship(OPCPackage pkg, PackagePart sourcePart,
+			URI targetUri, TargetMode targetMode, String relationshipType,
+			String id) {
+		if (pkg == null)
+			throw new IllegalArgumentException("pkg");
+		if (targetUri == null)
+			throw new IllegalArgumentException("targetUri");
+		if (relationshipType == null)
+			throw new IllegalArgumentException("relationshipType");
+		if (id == null)
+			throw new IllegalArgumentException("id");
+
+		this.container = pkg;
+		this.source = sourcePart;
+		this.targetUri = targetUri;
+		this.targetMode = targetMode;
+		this.relationshipType = relationshipType;
+		this.id = id;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (!(obj instanceof PackageRelationship)) {
+			return false;
+		}
+		PackageRelationship rel = (PackageRelationship) obj;
+		return (this.id == rel.id
+				&& this.relationshipType == rel.relationshipType
+				&& (rel.source != null ? rel.source.equals(this.source) : true)
+				&& this.targetMode == rel.targetMode && this.targetUri
+				.equals(rel.targetUri));
+	}
+
+	@Override
+	public int hashCode() {
+		return this.id.hashCode() + this.relationshipType.hashCode()
+				+ this.source.hashCode() + this.targetMode.hashCode()
+				+ this.targetUri.hashCode();
+	}
+
+	/* Getters */
+
+	public URI getContainerPartRelationship() {
+		return containerRelationshipPart;
+	}
+
+	/**
+	 * @return the container
+	 */
+	public OPCPackage getPackage() {
+		return container;
+	}
+
+	/**
+	 * @return the id
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/**
+	 * @return the relationshipType
+	 */
+	public String getRelationshipType() {
+		return relationshipType;
+	}
+
+	/**
+	 * @return the source
+	 */
+	public PackagePart getSource() {
+		return source;
+	}
+
+	/**
+	 * 
+	 * @return URL of the source part of this relationship
+	 */
+	public URI getSourceURI() {
+		if (source == null) {
+			return PackagingURIHelper.PACKAGE_ROOT_URI;
+		}
+		return source.partName.getURI();
+	}
+
+	/**
+	 * public URI getSourceUri(){ }
+	 * 
+	 * @return the targetMode
+	 */
+	public TargetMode getTargetMode() {
+		return targetMode;
+	}
+
+	/**
+	 * @return the targetUri
+	 */
+	public URI getTargetURI() {
+		// If it's an external target, we don't
+		//  need to apply our normal validation rules
+		if(targetMode == TargetMode.EXTERNAL) {
+			return targetUri;
+		}
+		
+		// Internal target
+		// If it isn't absolute, resolve it relative
+		//  to ourselves
+		if (!targetUri.toASCIIString().startsWith("/")) {
+			// So it's a relative part name, try to resolve it
+			return PackagingURIHelper.resolvePartUri(getSourceURI(), targetUri);
+		}
+		return targetUri;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append(id == null ? "id=null" : "id=" + id);
+		sb.append(container == null ? " - container=null" : " - container="
+				+ container.toString());
+		sb.append(relationshipType == null ? " - relationshipType=null"
+				: " - relationshipType=" + relationshipType.toString());
+		sb.append(source == null ? " - source=null" : " - source="
+				+ getSourceURI().toASCIIString());
+		sb.append(targetUri == null ? " - target=null" : " - target="
+				+ getTargetURI().toASCIIString());
+		sb.append(targetMode == null ? ",targetMode=null" : ",targetMode="
+				+ targetMode.toString());
+		return sb.toString();
+	}
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org