package er.attachment.metadata; import java.util.Iterator; import java.util.LinkedList; import java.util.List; /** * <span class="en"> * An ERMetadataDirectorySet contains generic metadata (like width/height) as well a set of * metadata directories (like EXIF or IPTC). * </span> * * <span class="ja"> * ERMetadataDirectorySet は一般メタデータを含みます。 (例 width/height) * 又はメタデータ・ディレクトリも含めるのです。 (例 EXIF や IPTC). * </span> * * @author mschrag */ public class ERMetadataDirectorySet { private List<IERMetadataDirectory> _metadataDirectories; private int _width; private int _height; private boolean _rotated; private String _caption; public ERMetadataDirectorySet() { _width = -1; _height = -1; _caption = null; _metadataDirectories = new LinkedList<>(); } /** * <span class="ja">Empty かどうかをチェックします。</span> */ public boolean isEmpty() { return _width == -1 && _height == -1 && _metadataDirectories.isEmpty(); } /** * <span class="en"> * Sets the width of the image. * * @param width the width of the image * </span> * * <span class="ja"> * イメージ幅をセットします。 * * @param width - イメージ幅 * </span> */ public void setWidth(int width) { _width = width; } /** * <span class="en"> * Returns the width of the image. * * @return width of the image * </span> * * <span class="ja"> * イメージ幅を戻します * * @return イメージ幅 * </span> */ public int getWidth() { return _width; } /** * <span class="en"> * Sets the height of the image. * * @param height the height of the image * </span> * * <span class="ja"> * イメージ高をセットします。 * * @param height - イメージ高 * </span> */ public void setHeight(int height) { _height = height; } /** * <span class="en"> * Returns the height of the image. * * @return height of the image * </span> * * <span class="ja"> * イメージ高を戻します。 * * @return イメージ高 * </span> */ public int getHeight() { return _height; } /** * <span class="en"> * Sets whether or not the given image was rotated. * * @param rotated whether or not the given image was rotated * </span> * * <span class="ja"> * イメージが回転されている場合には true をセットします。 * * @param rotated - イメージが回転されている場合には true をセット * </span> */ public void setRotated(boolean rotated) { _rotated = rotated; } /** * <span class="en"> * Returns whether or not the image was rotated. * * @return true if the image was rotated * </span> * * <span class="ja"> * イメージが回転されている場合には true が戻ります。 * * @return イメージが回転されている場合には true * </span> */ public boolean isRotated() { return _rotated; } /** * <span class="en"> * Returns the caption for the image. * * @return the caption for the image * </span> * * <span class="ja"> * イメージのキャプションを戻します。 * * @return イメージのキャプション * </span> */ public String getCaption() { return _caption; } /** * <span class="en"> * Sets the caption for the image. * * @param caption * </span> * * <span class="ja"> * イメージのキャプションをセットします。 * * @param caption - イメージのキャプション * </span> */ public void setCaption(String caption) { _caption = caption; } /** * <span class="en"> * Returns the metadata directory of the given type (IERMetadataDirectory.EXIF, IERMetadataDirectory.IPTC, etc). * * @param directoryName the metadata directory name * * @return the matching meatdata directory, or null if one does not exist * </span> * * <span class="ja"> * 指定タイプのメタデータ・ディレクトリを戻します。 (IERMetadataDirectory.EXIF, IERMetadataDirectory.IPTC, 等). * * @param directoryName - メタデータ・ディレクトリ名 * * @return マッチするメタデータ・ディレクトリ、なければ null * </span> */ public IERMetadataDirectory _getDirectoryNamed(String directoryName) { IERMetadataDirectory matchingMetadataDirectory = null; Iterator directoriesIter = _metadataDirectories.iterator(); while (matchingMetadataDirectory == null && directoriesIter.hasNext()) { IERMetadataDirectory metadataDirectory = (IERMetadataDirectory) directoriesIter.next(); if (directoryName.equals(metadataDirectory.getDirectoryName())) { matchingMetadataDirectory = metadataDirectory; } } return matchingMetadataDirectory; } /** * <span class="en"> * Returns the metadata directory of the given type (IERMetadataDirectory.EXIF, IERMetadataDirectory.IPTC, etc) and casts to an ERParsedMetadataDirectory. * * @param directoryName the metadata directory name * * @return the matching meatdata directory, or null if one does not exist * </span> * * <span class="ja"> * 指定タイプのメタデータ・ディレクトリを戻します。 (IERMetadataDirectory.EXIF, IERMetadataDirectory.IPTC, 等) * さらに ERParsedMetadataDirectory へキャストします。 * * @param directoryName - メタデータ・ディレクトリ名 * * @return マッチするメタデータ・ディレクトリ、なければ null * </span> */ public ERParsedMetadataDirectory getDirectoryNamed(String directoryName) { return (ERParsedMetadataDirectory) _getDirectoryNamed(directoryName); } /** * Adds a metadata directory to this set. * * @param metadata the metadata directory to add */ public void addMetadata(IERMetadataDirectory metadata) { _metadataDirectories.add(metadata); } /** * Returns the metadata directories from this set. */ public List<IERMetadataDirectory> getMetadataDirectories() { return _metadataDirectories; } /** * <span class="en"> * Adds the given raw directory set to this directory set. * * @param rawAssetMetadata a raw directory set * </span> * * <span class="ja"> * 指定の raw ディレクトリをディクショナリーセットに追加します。 * * @param rawAssetMetadata - raw ディクショナリーセット * </span> */ public void add(ERMetadataDirectorySet rawAssetMetadata) { if (rawAssetMetadata._width != -1) { _width = rawAssetMetadata._width; } if (rawAssetMetadata._height != -1) { _height = rawAssetMetadata._height; } _metadataDirectories.addAll(rawAssetMetadata._metadataDirectories); } protected List<IERMetadataDirectory> removeUnparsedDirectories() { List<IERMetadataDirectory> unparsedMetadataDirectories = new LinkedList<>(); Iterator<IERMetadataDirectory> metadataDirectoriesIter = _metadataDirectories.iterator(); while (metadataDirectoriesIter.hasNext()) { IERMetadataDirectory metadataDirectory = metadataDirectoriesIter.next(); if (metadataDirectory instanceof ERUnparsedMetadataDirectory) { unparsedMetadataDirectories.add(metadataDirectory); metadataDirectoriesIter.remove(); } } return unparsedMetadataDirectories; } protected void parseUnparsedDirectoriesWith(IERMetadataDirectoryParser metadataDirectoryParser) { Iterator<IERMetadataDirectory> metadataDirectoriesIter = new LinkedList<>(getMetadataDirectories()).iterator(); while (metadataDirectoriesIter.hasNext()) { IERMetadataDirectory metadataDirectory = metadataDirectoriesIter.next(); ERParsedMetadataDirectory parsedMetadataDirectory; if (metadataDirectory instanceof ERUnparsedMetadataDirectory) { ERUnparsedMetadataDirectory unparsedMetadataDirectory = (ERUnparsedMetadataDirectory) metadataDirectory; parsedMetadataDirectory = metadataDirectoryParser.parseMetadata(unparsedMetadataDirectory); if (parsedMetadataDirectory != null) { replaceUnparsedWithParsed(unparsedMetadataDirectory, parsedMetadataDirectory); } } else { parsedMetadataDirectory = (ERParsedMetadataDirectory) metadataDirectory; } } } protected void replaceUnparsedWithParsed(ERUnparsedMetadataDirectory oldMetadata, ERParsedMetadataDirectory newMetadata) { _metadataDirectories.remove(oldMetadata); if (newMetadata != null) { _metadataDirectories.add(newMetadata); } } @Override public String toString() { return "[MetadataDirectorySet: width = " + _width + "; height = " + _height + "; caption = " + _caption + "; metadataDirectories = " + _metadataDirectories + "]"; } }