package javax.imageio.metadata;
public abstract class IIOMetadata
{
protected IIOMetadataController controller;
protected IIOMetadataController defaultController;
protected String[] extraMetadataFormatClassNames;
protected String[] extraMetadataFormatNames;
protected String nativeMetadataFormatClassName;
protected String nativeMetadataFormatName;
protected boolean standardFormatSupported;
protected IIOMetadata()
{
}
protected IIOMetadata(boolean standardMetadataFormatSupported,
String nativeMetadataFormatName,
String nativeMetadataFormatClassName,
String[] extraMetadataFormatNames,
String[] extraMetadataFormatClassNames)
{
if (extraMetadataFormatNames != null
&& extraMetadataFormatNames.length == 0)
throw new IllegalArgumentException
("extraMetadataFormatNames may not be empty");
if (((extraMetadataFormatNames == null)
&& (extraMetadataFormatClassNames != null))
|| ((extraMetadataFormatNames != null)
&& (extraMetadataFormatClassNames == null))
|| ((extraMetadataFormatNames != null)
&& (extraMetadataFormatClassNames != null)
&& (extraMetadataFormatNames.length !=
extraMetadataFormatClassNames.length)))
throw new IllegalArgumentException
("extraMetadataFormatNames and extraMetadataFormatClassNames " +
"have different lengths");
this.standardFormatSupported = standardMetadataFormatSupported;
this.nativeMetadataFormatName = nativeMetadataFormatName;
this.nativeMetadataFormatClassName = nativeMetadataFormatClassName;
this.extraMetadataFormatNames = extraMetadataFormatNames;
this.extraMetadataFormatClassNames = extraMetadataFormatClassNames;
}
public boolean activateController()
{
if (! hasController())
return false;
return getDefaultController().activate(this);
}
public IIOMetadataController getController()
{
return controller;
}
public IIOMetadataController getDefaultController()
{
return defaultController;
}
public String[] getExtraMetadataFormatNames()
{
return (String[]) extraMetadataFormatNames.clone();
}
public IIOMetadataFormat getMetadataFormat(String formatName)
{
if (formatName == null)
throw new IllegalArgumentException("formatName may not be null");
String formatClassName = null;
if (isStandardMetadataFormatSupported()
&& formatName.equals(nativeMetadataFormatName))
formatClassName = nativeMetadataFormatClassName;
else
{
String[] extraFormatNames = getExtraMetadataFormatNames();
for (int i = extraFormatNames.length - 1; i >= 0; --i)
if (extraFormatNames[i].equals(formatName))
{
formatClassName = extraFormatNames[i];
break;
}
}
if (formatClassName == null)
throw new IllegalArgumentException("unknown format");
IIOMetadataFormat format;
try
{
format = (IIOMetadataFormat) Class.forName(formatClassName)
.newInstance();
}
catch (Exception e)
{
IllegalStateException ise = new IllegalStateException();
ise.initCause(e);
throw ise;
}
return format;
}
public String[] getMetadataFormatNames()
{
String[] formatNames = getExtraMetadataFormatNames();
if (isStandardMetadataFormatSupported())
{
String[] tmp = new String[formatNames.length + 1];
tmp[0] = getNativeMetadataFormatName();
for (int i = 1; i < tmp.length; ++i)
tmp[i] = formatNames[i - 1];
formatNames = tmp;
}
return formatNames;
}
public String getNativeMetadataFormatName()
{
return nativeMetadataFormatName;
}
public boolean hasController()
{
return getController() != null;
}
public abstract boolean isReadOnly();
public boolean isStandardMetadataFormatSupported()
{
return standardFormatSupported;
}
public abstract void reset();
public void setController(IIOMetadataController controller)
{
this.controller = controller;
}
}