/* * 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 javax.imageio.metadata; import java.util.ArrayList; import org.apache.harmony.x.imageio.metadata.IIOMetadataUtils; import org.w3c.dom.Node; /** * The class IIOMetadata represents the metadata (bundled with an image) as a * Dom-type tree. * * @since Android 1.0 */ public abstract class IIOMetadata { /** * Whether the standard metadata format is supported. */ protected boolean standardFormatSupported; /** * The native metadata format name. */ protected String nativeMetadataFormatName; /** * The native metadata format class name. */ protected String nativeMetadataFormatClassName; /** * The extra metadata format names. */ protected String[] extraMetadataFormatNames; /** * The extra metadata format class names. */ protected String[] extraMetadataFormatClassNames; /** * The default controller. */ protected IIOMetadataController defaultController; /** * The controller. */ protected IIOMetadataController controller; /** * Instantiates a new IIOMetadata with no data set. */ protected IIOMetadata() { } /** * Instantiates a new IIOMetadata with the specified data parameters. * * @param standardMetadataFormatSupported * whether the standard metadata format is supported. * @param nativeMetadataFormatName * the native metadata format name. * @param nativeMetadataFormatClassName * the native metadata format class name. * @param extraMetadataFormatNames * the extra metadata format names. * @param extraMetadataFormatClassNames * the extra metadata format class names. */ protected IIOMetadata(boolean standardMetadataFormatSupported, String nativeMetadataFormatName, String nativeMetadataFormatClassName, String[] extraMetadataFormatNames, String[] extraMetadataFormatClassNames) { standardFormatSupported = standardMetadataFormatSupported; this.nativeMetadataFormatName = nativeMetadataFormatName; this.nativeMetadataFormatClassName = nativeMetadataFormatClassName; if (extraMetadataFormatNames == null) { if (extraMetadataFormatClassNames != null) { throw new IllegalArgumentException( "extraMetadataFormatNames == null && extraMetadataFormatClassNames != null!"); } } else { if (extraMetadataFormatClassNames == null) { throw new IllegalArgumentException( "extraMetadataFormatNames != null && extraMetadataFormatClassNames == null!"); } if (extraMetadataFormatNames.length == 0) { throw new IllegalArgumentException("extraMetadataFormatNames.length == 0!"); } if (extraMetadataFormatClassNames.length != extraMetadataFormatNames.length) { throw new IllegalArgumentException( "extraMetadataFormatClassNames.length != extraMetadataFormatNames.length!"); } this.extraMetadataFormatNames = extraMetadataFormatNames.clone(); this.extraMetadataFormatClassNames = extraMetadataFormatClassNames.clone(); } } /** * Gets the metadata as tree-type document. * * @param formatName * the format name. * @return the node in tree format. */ public abstract Node getAsTree(String formatName); /** * Checks if the metadata is read only. * * @return true, if the metadata is read only. */ public abstract boolean isReadOnly(); /** * Merges the specified tree with this metadata tree. * * @param formatName * the format of the specified tree. * @param root * the root node of the metadata tree. * @throws IIOInvalidTreeException * if the specified tree is incompatible with the this metadata * tree. */ public abstract void mergeTree(String formatName, Node root) throws IIOInvalidTreeException; /** * Resets the controller. */ public abstract void reset(); /** * Gets the controller associated with this metadata document. * * @return the controller. */ public IIOMetadataController getController() { return controller; } /** * Checks whether this metadata has a controller. * * @return true, if this metadata has a controller. */ public boolean hasController() { return getController() != null; } /** * Activate the controller. * * @return true, if successful. */ public boolean activateController() { if (!hasController()) { throw new IllegalStateException("hasController() == false!"); } return getController().activate(this); } /** * Gets the default controller. * * @return the default controller. */ public IIOMetadataController getDefaultController() { return defaultController; } /** * Gets the extra metadata format names. * * @return the extra metadata format names. */ public String[] getExtraMetadataFormatNames() { return extraMetadataFormatNames == null ? null : extraMetadataFormatNames.clone(); } /** * Gets the metadata format. * * @param formatName * the format name. * @return the metadata format. */ public IIOMetadataFormat getMetadataFormat(String formatName) { return IIOMetadataUtils.instantiateMetadataFormat(formatName, standardFormatSupported, nativeMetadataFormatName, nativeMetadataFormatClassName, extraMetadataFormatNames, extraMetadataFormatClassNames); } /** * Gets the native metadata format name. * * @return the native metadata format name. */ public String getNativeMetadataFormatName() { return nativeMetadataFormatName; } /** * Checks if the standard metadata format is supported. * * @return true, if the standard metadata format is supported. */ public boolean isStandardMetadataFormatSupported() { return standardFormatSupported; } /** * Gets the metadata format names. * * @return the metadata format names. */ public String[] getMetadataFormatNames() { ArrayList<String> res = new ArrayList<String>(); String nativeMetadataFormatName = getNativeMetadataFormatName(); boolean standardFormatSupported = isStandardMetadataFormatSupported(); String extraMetadataFormatNames[] = getExtraMetadataFormatNames(); if (standardFormatSupported) { res.add(IIOMetadataFormatImpl.standardMetadataFormatName); } if (nativeMetadataFormatName != null) { res.add(nativeMetadataFormatName); } if (extraMetadataFormatNames != null) { for (String extraMetadataFormatName : extraMetadataFormatNames) { res.add(extraMetadataFormatName); } } return res.size() > 0 ? res.toArray(new String[0]) : null; } /** * Gets the standard chroma node. * * @return the standard chroma node. */ protected IIOMetadataNode getStandardChromaNode() { return null; } /** * Gets the standard compression node. * * @return the standard compression node. */ protected IIOMetadataNode getStandardCompressionNode() { return null; } /** * Gets the standard data node. * * @return the standard data node. */ protected IIOMetadataNode getStandardDataNode() { return null; } /** * Gets the standard dimension node. * * @return the standard dimension node. */ protected IIOMetadataNode getStandardDimensionNode() { return null; } /** * Gets the standard document node. * * @return the standard document node. */ protected IIOMetadataNode getStandardDocumentNode() { return null; } /** * Gets the standard text node. * * @return the standard text node. */ protected IIOMetadataNode getStandardTextNode() { return null; } /** * Gets the standard tile node. * * @return the standard tile node. */ protected IIOMetadataNode getStandardTileNode() { return null; } /** * Gets the standard transparency node. * * @return the standard transparency node. */ protected IIOMetadataNode getStandardTransparencyNode() { return null; } /** * Gets the metadata as a tree in standard format. * * @return the metadata as a tree in standard format. */ protected final IIOMetadataNode getStandardTree() { // Create root node IIOMetadataNode root = new IIOMetadataNode(IIOMetadataFormatImpl.standardMetadataFormatName); Node node; if ((node = getStandardChromaNode()) != null) { root.appendChild(node); } if ((node = getStandardCompressionNode()) != null) { root.appendChild(node); } if ((node = getStandardDataNode()) != null) { root.appendChild(node); } if ((node = getStandardDimensionNode()) != null) { root.appendChild(node); } if ((node = getStandardDocumentNode()) != null) { root.appendChild(node); } if ((node = getStandardTextNode()) != null) { root.appendChild(node); } if ((node = getStandardTileNode()) != null) { root.appendChild(node); } if ((node = getStandardTransparencyNode()) != null) { root.appendChild(node); } return root; } /** * Sets the controller. * * @param controller * the new controller. */ public void setController(IIOMetadataController controller) { this.controller = controller; } /** * Sets the from tree. * * @param formatName * the name of the metatdata format of the from tree. * @param root * the root node of the from tree. * @throws IIOInvalidTreeException * if the tree or its format is not compatible with this * metadata. */ public void setFromTree(String formatName, Node root) throws IIOInvalidTreeException { reset(); mergeTree(formatName, root); } }