Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   *  Copyright 2007-2008, Plutext Pty Ltd.
   *   
   *  This file is part of docx4j.
  
      docx4j is licensed 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.
 
  */
 /*
  * Portions Copyright (c) 2006, Wygwam
  * With respect to those portions:
  * 
  * All rights reserved.
  * 
  * Redistribution and use in source and binary forms, with or without modification, 
  * are permitted provided that the following conditions are met: 
  * 
  * - Redistributions of source code must retain the above copyright notice, 
  * this list of conditions and the following disclaimer.
  * - Redistributions in binary form must reproduce the above copyright notice, 
  * this list of conditions and the following disclaimer in the documentation and/or 
  * other materials provided with the distribution.
  * - Neither the name of Wygwam nor the names of its contributors may be 
  * used to endorse or promote products derived from this software without 
  * specific prior written permission. 
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
  * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 package org.docx4j.openpackaging.contenttype;
 
 import java.net.URI;
 import java.util.Map;
 
 
Manage package content types ([Content_Types].xml ) .

Author(s):
Julien Chable
Version:
1.0
public class ContentTypeManager  {
	protected static Logger log = LoggerFactory.getLogger(ContentTypeManager.class);

Content type part name.
	public static final String CONTENT_TYPES_PART_NAME = "[Content_Types].xml";

Content type namespace
	public static final String TYPES_NAMESPACE_URI = "http://schemas.openxmlformats.org/package/2006/content-types";
	/* Xml elements in content type part */
	private static final String TYPES_TAG_NAME = "Types";
	private static final String DEFAULT_TAG_NAME = "Default";
	private static final String EXTENSION_ATTRIBUTE_NAME = "Extension";
	private static final String CONTENT_TYPE_ATTRIBUTE_NAME = "ContentType";
	private static final String OVERRIDE_TAG_NAME = "Override";
	private static final String PART_NAME_ATTRIBUTE_NAME = "PartName";

Default content type tree. <Extension, ContentType>

Returns:
the defaultContentType
Since:
2.8.1
	}

Override content type tree.

Returns:
the overrideContentType
Since:
2.8.1
	}
	private static ObjectFactory ctFactory = new ObjectFactory();
	public ContentTypeManager()  {
	}
	private void init() {
	}
//	/**
//	 * Build association extention-> content type (will be stored in
//	 * [Content_Types].xml) for example ContentType="image/png" Extension="png"
//	 * 
//	 * @param partUri
//	 *            the uri that will be stored
//	 * @return <b>false</b> if an error occured.
//	 */
//	public void addContentType(PartName partName, String contentType) {
//		boolean defaultCTExists = false;
//		String extension = partName.getExtension();
//		if ((extension.length() == 0)
//				|| (this.defaultContentType.containsKey(extension) 
//						&& !(defaultCTExists = this.defaultContentType.containsValue(contentType)))) {
//			this.addOverrideContentType(partName.getURI(), contentType);
//		} else if (!defaultCTExists) {
//			this.addDefaultContentType(extension, contentType);
//		}
//	}
Add an override content type for a specific part.

Parameters:
partUri Uri of the part.
contentType Content type of the part.
	public void addOverrideContentType(URI partUriCTOverride contentType) {
		.debug("Registered " + partUri.toString() + " of type " + contentType.getContentType() );
		.put(partUricontentType);
	}
	public void addOverrideContentType(URI partUriString contentType) {
		overrideCT.setPartNamepartUri.toASCIIString() );
		overrideCT.setContentType(contentType );
		.put(partUrioverrideCT);
	}
//	public String getOverrideContentType(URI partUri) {
//		return overrideContentType.get(partUri);
//	}
	/* Given a content type, return the Part Name URI is it
	 * overridden by.
	 */ 
		// hmm, can there only be one instance of a given
		// content type?
		while (i.hasNext()) {
			Map.Entry e = (Map.Entry)i.next();
			if (e != null) {
				.debug("Inspecting " + e.getValue());
				if ( ((CTOverride)e.getValue()).getContentType().equals(contentType) ) {
					.debug("Matched!");
					return (URI)e.getKey(); 
				}
		return null;
	}
	/* Return a part of the appropriate sub class */
		Part p;
		// look for an override
		CTOverride overrideCT = (CTOverride.get(new URI(partName));
		if (overrideCT!=null ) {
			String contentType = overrideCT.getContentType(); 
			.debug("Found content type '" + contentType + "' for " + partName);
			 p = newPartForContentType(contentTypepartNamerel);
			 p.setContentTypenew ContentType(contentType) );
			 return p;
		}		
		// if there is no override, get use the file extension
		String ext = partName.substring(partName.indexOf(".") + 1).toLowerCase();
		.debug("Looking at extension '" + ext);
		if (defaultCT!=null ) {
			String contentType = defaultCT.getContentType();
			.debug("Found content type '" + contentType + "' for "
partName);
			p = newPartForContentType(contentTypepartNamerel);
			p.setContentType(new ContentType(contentType));
			return p;
		}
		// otherwise
		.error("No content type found for " + partName);
		return null;		
	}
	public Part newPartForContentType(String contentTypeString partNameRelationship rel)
		// TODO - a number of WordML parts aren't listed here!
		if (rel!=null && rel.getType().equals(.) ) {
			// Could have just passed String relType
			// Null where used from BPAI, and a FlatOpcXmlImporter case.
			// Cases where rel is not available can prepare a suitable dummy
				new AlternativeFormatInputPart(new PartName(partName) );
			afip.setContentType(new ContentType(contentType));
			return afip;
else if (rel!=null && rel.getType().equals(.) ) {
			EmbeddedPackagePart epp = new EmbeddedPackagePart(new PartName(partName) );
			epp.setContentType(new ContentType(contentType));
			return epp;
else if (rel!=null && rel.getType().equals(.) ) {
			OleObjectBinaryPart olePart = new OleObjectBinaryPart(new PartName(partName));
			olePart.setContentType(new ContentType(contentType));
			return olePart;
else if (contentType.equals(.)) { 
			// how is the main document distinguished from the glossary document?
			// Answer:- Main Document is a Package level relationship target,
			// whereas the Glossary Document is a Part-level target (from the
			// Main Document part)						
else if (contentType.equals(.)) {
else if (contentType.equals(.)) {
			return CreateDocPropsCorePartObject(partName ); 
			return CreateDocPropsCustomPartObject(partName );
			// NB, since this is just "application/xml", it 
else if (contentType.equals(.)) {
			return CreateObfuscatedFontPartObject(partName );
else if (contentType.equals(.)) {
			return CreateThemePartObject(partName );
else if (contentType.equals(.)) {
			return CreateCommentsPartObject(partName );
else if (contentType.equals(.)) {
			return CreateEndnotesPartObject(partName );
else if (contentType.equals(.)) {
			return CreateFontTablePartObject(partName );
else if (contentType.equals(.)) {
			return CreateFooterPartObject(partName );
else if (contentType.equals(.)) {
			return CreateFootnotesPartObject(partName );
else if (contentType.equals(.)) {
			return CreateHeaderPartObject(partName );
else if (contentType.equals(.)) {
			return CreateNumberingPartObject(partName );
else if (contentType.equals(.)) {
else if (contentType.equals(.)) { 
else if (contentType.equals(.)) {
			return CreateWebSettingsPartObject(partName );
else if (contentType.equals(.)) {
			return new VbaDataPart(new PartName(partName));
else if (contentType.equals(.)) {
			return new VbaProjectBinaryPart(new PartName(partName));
else if (contentType.equals(.)) {
else if (contentType.equals(.)) {
else if (contentType.equals(.)) {
else if (contentType.equals(.)) {
//		} else if (contentType.equals(ContentTypes.IMAGE_EPS)) {
//			return new org.docx4j.openpackaging.parts.WordprocessingML.ImageEpsPart(new PartName(partName));
else if (contentType.equals(.)) {
else if (contentType.equals(.) || contentType.equals(.)) {
			return new MetafileEmfPart(new PartName(partName));
else if (contentType.equals(.)) {
			return new MetafileWmfPart(new PartName(partName));
else if (contentType.equals(.)) {
			return new VMLPart(new PartName(partName));
//			return new VMLBinaryPart(new PartName(partName));				
else if (contentType.equals(.)) {
else if (contentType.startsWith("application/vnd.openxmlformats-officedocument.drawing")) {
			try {
				return JaxbDmlPart.newPartForContentType(contentTypepartName);
catch (Exception e) {
				return new BinaryPartnew PartName(partName));				
			}
else if (contentType.startsWith("application/vnd.openxmlformats-officedocument.presentationml")) {
			try {
				return JaxbPmlPart.newPartForContentType(contentTypepartName);
catch (Exception e) {
				return new BinaryPartnew PartName(partName));				
			}
else if (contentType.equals(.)
			try {
				return new WorkbookPart(new PartName(partName));
catch (Exception e) {
				return new BinaryPartnew PartName(partName));				
			}
else if (contentType.startsWith("application/vnd.openxmlformats-officedocument.spreadsheetml")) {
			try {
				return JaxbSmlPart.newPartForContentType(contentTypepartName);
catch (Exception e) {
				return new BinaryPartnew PartName(partName));				
			}
else if (contentType.equals(.)) {
else if (contentType.equals(.)
				|| partName.endsWith(".xml")) {
			// Rarely (but sometimes) used, owing to OFFICEDOCUMENT_CUSTOMXML_DATASTORAGE above.
			// Simple minded detection of XML content.
			// If it turns out not to be XML, the zip loader
			// will catch the error and load it as a binary part instead.
			.warn("DefaultPart used for part '" + partName 
"' of content type '" + contentType + "'");
			return CreateDefaultXmlPartObject(partName );
else {
			.error("No subclass found for " + partName + "; defaulting to binary");
			//throw new PartUnrecognisedException("No subclass found for " + partName + " (content type '" + contentType + "')");		
			return new BinaryPartnew PartName(partName));
		}
	}
		return new DefaultXmlPart(new PartName(partName));
	}
		return new MainDocumentPart(new PartName(partName));
	}
		return new StyleDefinitionsPart(new PartName(partName));
	}
		return new DocumentSettingsPart(new PartName(partName));
	}
		return new WebSettingsPart(new PartName(partName));
	}
		return new FontTablePart(new PartName(partName));
	}
	public Part CreateThemePartObject(String partName)
		return new ThemePart(new PartName(partName));
	}
		return new DocPropsCorePart(new PartName(partName));
	}
		return new DocPropsExtendedPart(new PartName(partName));
	}
		.info("Using DocPropsCustomPart ...");		
		return new DocPropsCustomPart(new PartName(partName));
	}
		return new CommentsPart(new PartName(partName));
	}
		return new CustomXmlDataStoragePropertiesPart(new PartName(partName));
	}
		return new EndnotesPart(new PartName(partName));
	}
		return new FooterPart(new PartName(partName));
	}
		return new FootnotesPart(new PartName(partName));
	}
		return new GlossaryDocumentPart(new PartName(partName));
	}
		return new HeaderPart(new PartName(partName));
	}
		return new NumberingDefinitionsPart(new PartName(partName));
	}
		return new ObfuscatedFontPart(new PartName(partName));
	}

Add a content type associated with the specified extension.

Parameters:
extension The part name extension to bind to a content type.
contentType The content type associated with the specified extension.
	public void addDefaultContentType(String extensionCTDefault contentType) {
		.debug("Registered " + extension );
		.put(extension.toLowerCase(), contentType);
	}
	public void addDefaultContentType(String extensionString contentType) {
		defaultCT.setExtension(extension.toLowerCase());
		defaultCT.setContentType(contentType);
		.debug("Registered " + extension );
		.put(extension.toLowerCase(), defaultCT);
	}


Delete a content type based on the specified part name. If the specified part name is register with an override content type, then this content type is remove, else the content type is remove in the default content type list if it exists.

Parameters:
partUri The part URI associated with the override content type to delete.
	public void removeContentType(PartName partName) {
		if (partName == null)
			throw new IllegalArgumentException("partName");
		// Override content type
		if (this. != null
				&& (this..get(partName.getURI()) != null)) {
			return;
		}
		// Default content type
	}

Check if the specified content type is already registered as a default content type. We don't currently have a method to check whether its registered as an override content type; getContentType(PartName partName) may suffice for that purpose.

Parameters:
contentType The content type to check.
Returns:
true if the specified content type is already registered, then false.
	public boolean isContentTypeRegistered(String contentType) {
		if (contentType == null)
			throw new IllegalArgumentException("contentType");
		return this..values().contains(contentType); 
//				|| (this.overrideContentType != null 
//						&& this.overrideContentType.values().contains(contentType)));
	}

Get the content type for the specified part, if any.

Parameters:
partUri The URI part to check.
Returns:
The content type associated with the URI (in case of an override content type) or the extension (in case of default content type), else null.
	public String getContentType(PartName partName) {
		if (partName == null)
			throw new IllegalArgumentException("partName");
		if ((this. != null)
			return this..get(partName.getURI()).getContentType();
		String extension = partName.getExtension().toLowerCase();
		if (this..containsKey(extension))
			return this..get(extension).getContentType();
		return null;
	}

Clear all content types.
	public void clearAll() {
		if (this. != null)
	}

Clear all override content types.
	public void clearOverrideContentTypes() {
		if (this. != null)
	}
	public void parseContentTypesFile(InputStream contentTypes
		CTTypes types;
		try {
		    		    
			//u.setSchema(org.docx4j.jaxb.WmlSchema.schema);
			.debug("unmarshalling " + this.getClass().getName() );		
			Object res = XmlUtils.unwrap(u.unmarshalcontentTypes ));
			//types = (CTTypes)((JAXBElement)res).getValue();				
			types = (CTTypes)res;
			//log.debug( types.getClass().getName() + " unmarshalled" );
				XmlUtils.marshaltoString(restruetrue. );
			}
			CTDefault defaultCT;
			CTOverride overrideCT;
			for(Object o : types.getDefaultOrOverride() ) {
				if (o instanceof CTDefault) {
					defaultCT = (CTDefault)o;
					addDefaultContentTypedefaultCT.getExtension(), defaultCT  );
				}
				if (o instanceof CTOverride) {
					overrideCT = (CTOverride)o;
					URI uri = new URI(overrideCT.getPartName() );
					addOverrideContentType(urioverrideCT );
				}
			}
catch (Exception e ) {
			throw new InvalidFormatException("Bad [Content_Types].xml"e);
		}
	}
	private CTTypes buildTypes() {
		// Build the JAXB object
		ObjectFactory factory = new ObjectFactory();
		CTTypes types = factory.createCTTypes();
		}
		if ( != null) {
			}
		}	
		return types;
	}
//	public void listTypes() {
//		
//
//		for (Entry<String, CTDefault> entry : defaultContentType.entrySet()) {
//			
//			System.out.println("// " + entry.getValue().getExtension());
//			System.out.println("public final static String XX =" );
//			System.out.println(entry.getValue().getContentType());
//		}
//
//		if (overrideContentType != null) {
//			for (Entry<URI, CTOverride> entry : overrideContentType.entrySet()) {
//				System.out.println("// " + entry.getValue().getPartName());
//				System.out.println("public final static String XX =" );
//				System.out.println("\"" + entry.getValue().getContentType() + "\";");
//			}
//		}	
//	}
    public void marshal(org.w3c.dom.Node nodethrows JAXBException {
		try {
			NamespacePrefixMapperUtils.setProperty(marshaller
					NamespacePrefixMapperUtils.getPrefixMapper() );
			.debug("marshalling " + this.getClass().getName() + " ..." );									
			marshaller.marshal(buildTypes(), node);
			.info("content types marshalled \n\n" );									
catch (JAXBException e) {
			//e.printStackTrace();
			throw e;
		}
    }
    
    public void marshal(java.io.OutputStream osthrows JAXBException {
		try {
			NamespacePrefixMapperUtils.setProperty(marshaller
					NamespacePrefixMapperUtils.getPrefixMapper() );
			.info("marshalling " + this.getClass().getName() + " ..." );									
			marshaller.marshal(buildTypes(), os);
catch (JAXBException e) {
			//e.printStackTrace();
			throw e;
		}
	}



Return a package of the appropriate type. Used when loading an existing Package, with an already populated [Content_Types].xml. When creating a new Package, start with the new WordprocessingMLPackage constructor.
	public OpcPackage createPackage(String pkgContentTypethrows InvalidFormatException {
		  
		// Check overrides first
			.info("Detected WordProcessingML package ");
			p = new WordprocessingMLPackage(this);
			return p;
else if (pkgContentType.equals(.
			.info("Detected PresentationMLPackage package ");
			p = new PresentationMLPackage(this);
			return p;
else if (pkgContentType.equals(.
			//  "xlam", "xlsb" ?
			.info("Detected SpreadhseetMLPackage package ");
			p = new SpreadsheetMLPackage(this);
			return p;			
else if (pkgContentType.equals(.) ) {
			.info("Detected Glox file ");
			p = new GloxPackage(this);
			return p;						
		// Nothing in overrides or defaults
		throw new InvalidFormatException("Couldn't identify package from " + pkgContentType);
	}
	/*
	 * Gets the content type from an extension.
	 
	public static String getContentTypeFromExtension(String extension) {
		if ((extension.equals(ContentTypes.EXTENSION_JPG_1))
				|| (extension.equals(ContentTypes.EXTENSION_JPG_2))) {
			return ContentTypes.IMAGE_JPEG;
		}
		if (extension.equals(ContentTypes.EXTENSION_PNG)) {
			return ContentTypes.IMAGE_PNG;
		}
		if (extension.equals(ContentTypes.EXTENSION_GIF)) {
			return ContentTypes.IMAGE_GIF;
		}
		if (extension.equals(ContentTypes.EXTENSION_TIFF)) {
			return ContentTypes.IMAGE_TIFF;
		}
		if (extension.equals(ContentTypes.EXTENSION_PICT)) {
			return ContentTypes.IMAGE_PICT;
		}
		return null;
	}
*/
    public boolean isContentEqual(ContentTypeManager otherthrows Docx4JException {
    	
    	ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    	ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); 
    	try {
        	marshal(baos);
			other.marshal(baos2);
catch (JAXBException e) {
			throw new Docx4JException("Error marshalling parts"e);
		}
    	
    	return java.util.Arrays.equals(baos.toByteArray(), baos2.toByteArray());
    }
    public String toString() {
    	
    	CTTypes types = buildTypes();
    	return XmlUtils.marshaltoString(typestruetrue.);
    	
    }
New to GrepCode? Check out our FAQ X