| /* |
| * 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); |
| } |
| } |