package er.attachment.utils;
import com.webobjects.foundation.NSArray;
/**
* <div class="en">
* ERMimeType stores the metadata about a particular mime type.
* </div>
*
* <div class="ja">
* ERMimeType はある Mime タイプのメタデータを保持します。
* </div>
*
* @author mschrag
*/
public class ERMimeType {
private String _name;
private String _mimeType;
private String _uti;
private NSArray<String> _extensions;
/**
* <div class="en">
* Constructs an ERMimeType.
* </div>
*
* <div class="ja">
* コンストラクタ
* </div>
*
* @param name <div class="en">the display name of the mime type ("Portable Network Graphics")</div>
* <div class="ja">Mime タイプの表示名称 ("Portable Network Graphics")</div>
* @param mimeType <div class="en">the mime type string ("image/jpg")</div>
* <div class="ja">Mime タイプ文字列表記 ("image/jpg")</div>
* @param uti <div class="en">the universal type identifier that corresponds to this mime type ("public.jpeg")</div>
* <div class="ja">Mime タイプへの対応されている universal type identifier ("public.jpeg")</div>
* @param extensions <div class="en">the array of file extensions for this mime type ("jpg", "jpeg", etc)</div>
* <div class="ja">Mime タイプの拡張子配列 ("jpg", "jpeg", etc)</div>
*/
public ERMimeType(String name, String mimeType, String uti, NSArray<String> extensions) {
_name = name;
_mimeType = mimeType;
_uti = uti;
_extensions = extensions;
}
/**
* <div class="en">
* Returns the glob type of this mime type (image/pdf=>image/*).
* </div>
*
* <div class="ja">
* Mime タイプの glob タイプを戻します。 (image/pdf=>image/*)
* </div>
*
* @return <div class="en">the glob type of this mime type</div>
* <div class="ja">Mime タイプの glob タイプ</div>
*/
public ERGlobMimeType globMimeType() {
return new ERGlobMimeType(type() + "/*");
}
/**
* <div class="en">
* Returns true if this mime type exactly matches the other, meaning, the
* underlying mime type strings are identical.
* </div>
*
* <div class="ja">
* Mime タイプが指定されている Mime タイプと完全一する場合 true を戻します。
* Mime タイプの文字列表記が全く同様です。
* </div>
*
* @param mimeType <div class="en">the other mime type to compare</div>
* <div class="ja">比較のために指定する Mime タイプ</div>
*
* @return <div class="en">true if the mime type strings are identical</div>
* <div class="ja">全く同様であれば、 true が戻ります。</div>
*/
public boolean matchesExactly(ERMimeType mimeType) {
return _mimeType.equalsIgnoreCase(mimeType._mimeType);
}
/**
* <div class="en">
* Supports glob mime types for comparison, so image/* matches image/jpeg.
* </div>
*
* <div class="ja">
* 比較の為の glob Mime タイプのサポートします。
* image/* は image/jpeg をマッチします。
* </div>
*
* @param otherMimeType <div class="en">the other mime type to compare against</div>
* <div class="ja">比較する為の Mime タイプ</div>
*
* @return <div class="en">true if the mime types are compatible</div>
* <div class="ja">Mime タイプの互換あれば、 true が戻ります。</div>
*/
public boolean matches(ERMimeType otherMimeType) {
boolean matches;
if ("*".equals(_mimeType) || (otherMimeType != null && "*".equals(otherMimeType._mimeType))) {
matches = true;
}
else if (otherMimeType == null) {
matches = false;
}
else {
String mimeTypeStr = _mimeType;
String otherMimeTypeStr = otherMimeType._mimeType;
int slashIndex = mimeTypeStr.indexOf('/');
int otherSlashIndex = otherMimeTypeStr.indexOf('/');
String base = mimeTypeStr.substring(0, slashIndex);
String otherBase = otherMimeTypeStr.substring(0, otherSlashIndex);
if (base.equals(otherBase)) {
String type = mimeTypeStr.substring(slashIndex + 1);
String otherType = otherMimeTypeStr.substring(otherSlashIndex + 1);
matches = "*".equals(type) || "*".equals(otherType) || type.equals(otherType);
}
else {
matches = false;
}
}
return matches;
}
/**
* <div class="en">
* Returns the name of this mime type.
* </div>
*
* <div class="ja">
* Mime タイプの表示名称を戻します。
* </div>
*
* @return <div class="en">the name of this mime type</div>
* <div class="ja">Mime タイプの表示名称</div>
*/
public String name() {
return _name;
}
/**
* <div class="en">
* Returns the mime type string representation.
* </div>
*
* <div class="ja">
* Mime タイプ文字列表記を戻します。
* </div>
*
* @return <div class="en">the mime type string representation</div>
* <div class="ja">Mime タイプ文字列表記</div>
*/
public String mimeType() {
return _mimeType;
}
/**
* <div class="en">
* Returns the universal type identifier.
* </div>
*
* <div class="ja">
* Mime タイプへの対応されている universal type identifier を戻します。
* </div>
*
* @return <div class="en">the universal type identifier</div>
* <div class="ja">Mime タイプへの対応されている universal type identifier</div>
*/
public String uti() {
return _uti;
}
/**
* <div class="en">
* Returns the list of extensions that map to this mime type.
* </div>
*
* <div class="ja">
* Mime タイプの拡張子配列を戻します。
* </div>
*
* @return <div class="en">the list of extensions that map to this mime type</div>
* <div class="ja">Mime タイプの拡張子配列</div>
*/
public NSArray<String> extensions() {
return _extensions;
}
/**
* <div class="en">
* Returns true if this mime type represents a file of the given extension.
* </div>
*
* <div class="ja">
* 指定されている拡張子は Mime タイプ文字列表記の一部である時に true を戻します。
* </div>
*
* @param extension <div class="en">the extension to lookup</div>
* <div class="ja">ルックアップされる拡張子</div>
*
* @return <div class="en">true if the extension matches one of the extensions in this mime type</div>
* <div class="ja">Mime タイプの拡張子の一つがマッチする時には true が戻ります。</div>
*/
public boolean isRepresentedByExtension(String extension) {
boolean representedByExtension = false;
for (int i = 0; !representedByExtension && i < _extensions.count(); i++) {
representedByExtension = _extensions.objectAtIndex(i).equalsIgnoreCase(extension);
}
return representedByExtension;
}
/**
* <div class="en">
* Returns the "primary" extension for this mime type. The primary extension is
* the first extension in the list, and generally should be considered the most
* common extension to use for the type.
* </div>
*
* <div class="ja">
* Mime タイプの「優先」拡張子を戻します。優先される拡張子はリスト内の最初のエレメントです。
* 一番よく使用されるべきの拡張子が最初に来るはずです。
* </div>
*
* @return <div class="en">the primary extension (or "" if there are no extensions)</div>
* <div class="ja">優先される拡張子 (又は、拡張子がない場合には "")</div>
*/
public String primaryExtension() {
String extension;
if (_extensions != null && _extensions.count() > 0) {
extension = _extensions.objectAtIndex(0);
}
else {
extension = "";
}
return extension;
}
/**
* <div class="en">
* Returns the part of the mime type before the "/".
* </div>
*
* <div class="ja">
* "/" の前にある Mime タイプを戻します。
* </div>
*
* @return <div class="en">the type of the mime type</div>
* <div class="ja">Mime タイプの親分類を戻します</div>
*/
public String type() {
return _mimeType.substring(0, _mimeType.indexOf('/'));
}
/**
* <div class="en">
* Returns the part of the mime type after the "/".
* </div>
*
* <div class="ja">
* "/" の後に続く Mime タイプを戻します。
* </div>
*
* @return <div class="en">the subtype of the mime type</div>
* <div class="ja">Mime タイプの子分類を戻します</div>
*/
public String subtype() {
return _mimeType.substring(_mimeType.indexOf('/') + 1);
}
/**
* <div class="en">
* Returns true for image/<whatever> mime types.
* </div>
*
* <div class="ja">
* image/<whatever> を含む場合には true が戻ります。
* </div>
*
* @return <div class="en">true for image/<whatever> mime types</div>
* <div class="ja">image/<whatever> を含む場合には true</div>
*/
public boolean isImage() {
return _mimeType.startsWith("image/");
}
/**
* <div class="en">
* Returns true for video/<whatever> mime types.
* </div>
*
* <div class="ja">
* video/<whatever> を含む場合には true が戻ります。
* </div>
*
* @return <div class="en">true for video/<whatever> mime types</div>
* <div class="ja">video/<whatever> を含む場合には true</div>
*/
public boolean isVideo() {
return _mimeType.startsWith("video/");
}
/**
* <div class="en">
* Returns true for audio/<whatever> mime types.
* </div>
*
* <div class="ja">
* audio/<whatever> を含む場合には true が戻ります。
* </div>
*
* @return <div class="en">true for audio/<whatever> mime types</div>
* <div class="ja">audio/<whatever> を含む場合には true</div>
*/
public boolean isAudio() {
return _mimeType.startsWith("audio/");
}
@Override
public String toString() {
return "[ERMimeType: mimeType=" + _mimeType + "]";
}
}