372 lines
11 KiB
Java
372 lines
11 KiB
Java
|
/*
|
||
|
* 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.
|
||
|
*/
|
||
|
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);
|
||
|
}
|
||
|
}
|