blob: 96cebf98d63bfb4481d527307253d3e3dd202b87 [file] [log] [blame]
/*
* 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);
}
}