package er.attachment.model;
import java.io.File;
import java.util.NoSuchElementException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.webobjects.eocontrol.EOEditingContext;
import com.webobjects.eocontrol.EOQualifier;
import er.attachment.processors.ERAttachmentProcessor;
import er.attachment.utils.ERMimeType;
import er.attachment.utils.ERMimeTypeManager;
import er.extensions.foundation.ERXFileUtilities;
import er.extensions.qualifiers.ERXKeyValueQualifier;
/**
* <span class="en">
* ERAttachment is the superclass of all attachment types. An attachment object
* encapsulates a small amount of metadata and the information necessary to
* construct a url or a stream onto the attachment data.
* </span>
*
* <span class="ja">
* 全アタッチメント・タイプのスーパークラスである。
* アタッチメント・オブジェクトはメタデータの一部を保存し、さらに URL 生成やストリーム作成の
* 情報も含みます。
* </span>
*
* @author mschrag
*/
public abstract class ERAttachment extends _ERAttachment {
/**
* Do I need to update serialVersionUID?
* See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the
* <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a>
*/
private static final long serialVersionUID = 1L;
private static final Logger log = LoggerFactory.getLogger(ERAttachment.class);
private boolean isInNestedEditingContext(EOEditingContext attachmentEc) {
return (attachmentEc.parentObjectStore() instanceof EOEditingContext);
}
private boolean isInNestedEditingContext() {
return isInNestedEditingContext(editingContext());
}
@Override
public void didInsert() {
super.didInsert();
if (!isInNestedEditingContext()) {
ERAttachmentProcessor.processorForType(this).attachmentInserted(this);
}
}
/**
* <span class="en">
* Returns the file name portion of the webPath.
*
* @return the file name portion of the webPath
* </span>
*
* <span class="ja">
* webPath よりのファイル名部分を戻します。
*
* @return webPath よりのファイル名部分
* </span>
*/
public String fileName() {
return new File(webPath()).getName();
}
/**
* <span class="en">
* Returns the ERMimeType that corresponds to the mimeType.
*
* @return the ERMimeType that corresponds to the mimeType
* </span>
*
* <span class="ja">
* mimeType に対応する ERMimeType を戻します。
*
* @return mimeType に対応する ERMimeType
* </span>
*/
public ERMimeType erMimeType() {
return ERMimeTypeManager.mimeTypeManager().mimeTypeForMimeTypeString(mimeType(), false);
}
/**
* <span class="en">
* Returns the file extension of this attachment, first checking the mime type,
* then returning the actual extension.
*
* @return the file extension of this attachment
* </span>
*
* <span class="ja">
* アタッチメントの拡張子を戻します。
* 最初あ MIME タイプをチェックされ、その後では本当の拡張子をチェックします。
*
* @return アタッチメントの拡張子
* </span>
*/
public String extension() {
String ext;
ERMimeType mimeType = erMimeType();
if (mimeType == null) {
ext = ERXFileUtilities.fileExtension(originalFileName()).toLowerCase();
}
else {
ext = mimeType.primaryExtension();
}
return ext;
}
/**
* <span class="en">
* Fetches the required attachment associated with the given web path.
*
* @param editingContext the editing context to load in
* @param webPath the web path of the attachment
*
* @return the attachment
*
* @throws NoSuchElementException if there is no attachment with the given web path
* </span>
*
* <span class="ja">
* 指定 web パスと関連されているアタッチメントをフェッチします。
*
* @param editingContext - ロードする編集コンテキスト
* @param webPath - アタッチメントの web パス
*
* @return アタッチメント
*
* @throws NoSuchElementException - 指定 web パスのアタッチメントが無い場合
* </span>
*/
public static ERAttachment fetchRequiredAttachmentWithWebPath(EOEditingContext editingContext, String webPath) {
ERAttachment attachment = ERAttachment.fetchRequiredERAttachment(editingContext, thatAreForWebPath(webPath));
return attachment;
}
public static EOQualifier thatAreForWebPath(String webPath) {
final ERXKeyValueQualifier qualifier = ERAttachment.WEB_PATH.is(webPath);
return qualifier;
}
@Override
public void didDelete(EOEditingContext ec) {
super.didDelete(ec);
if (!isInNestedEditingContext(ec)) {
try {
ERAttachmentProcessor.processorForType(this).deleteAttachment(this);
}
catch (Throwable e) {
log.error("Failed to delete attachment '{}'.", primaryKey(), e);
}
}
}
}