package org.jboss.seam.wiki.core.action;
import org.jboss.seam.ScopeType;
import org.jboss.seam.Component;
import org.jboss.seam.international.Messages;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.wiki.core.model.WikiUpload;
import org.jboss.seam.wiki.core.model.WikiDirectory;
import org.jboss.seam.wiki.core.upload.UploadType;
import org.jboss.seam.wiki.core.upload.UploadTypes;
import org.jboss.seam.wiki.core.upload.Uploader;
import org.jboss.seam.wiki.core.upload.importers.metamodel.ImporterRegistry;
import org.jboss.seam.wiki.core.upload.importers.metamodel.Importer;
import org.jboss.seam.wiki.core.upload.editor.UploadEditor;
import static org.jboss.seam.international.StatusMessage.Severity.INFO;
import java.util.Date;
import java.util.Map;
import java.util.List;
import java.util.Collections;
@Name("uploadHome")
@Scope(ScopeType.CONVERSATION)
public class UploadHome extends NodeHome<WikiUpload, WikiDirectory> {
public static final String UPLOAD_NODE_REMOVER = "uploadNodeRemover";
/* -------------------------- Context Wiring ------------------------------ */
@In(required = false)
Uploader uploader;
@In
Map<String, UploadType> uploadTypes;
@In
private TagEditor tagEditor;
@In
ImporterRegistry importerRegistry;
/* -------------------------- Internal State ------------------------------ */
protected UploadEditor uploadEditor;
protected String importer;
/* -------------------------- Basic Overrides ------------------------------ */
@Override
public Class<WikiUpload> getEntityClass() {
return WikiUpload.class;
}
@Override
public WikiUpload findInstance() {
return getWikiNodeDAO().findWikiUpload((Long)getId());
}
@Override
protected WikiDirectory findParentNode(Long parentNodeId) {
return getEntityManager().find(WikiDirectory.class, parentNodeId);
}
@Override
public WikiUpload afterNodeCreated(WikiUpload ignoredNode) {
if (uploader == null || uploader.getUpload() == null) {
throw new RuntimeException("No uploader found for create");
}
getLog().debug("initializing with new uploaded file: " + uploader.getFilename());
WikiUpload upload = uploader.getUpload();
upload = super.afterNodeCreated(upload);
initUploadEditor(upload);
tagEditor.setTags(upload.getTags());
return upload;
}
@Override
public WikiUpload beforeNodeEditNew(WikiUpload upload) {
tagEditor.setTags(upload.getTags());
return super.beforeNodeEditNew(upload);
}
@Override
public WikiUpload afterNodeFound(WikiUpload upload) {
upload = super.afterNodeFound(upload);
getLog().debug("initializing with existing upload '" + upload + "' and content type: " + upload.getContentType());
initUploadEditor(upload);
tagEditor.setTags(upload.getTags());
return upload;
}
@Override
public WikiUpload beforeNodeEditFound(WikiUpload upload) {
tagEditor.setTags(upload.getTags());
return super.beforeNodeEditFound(upload);
}
/* -------------------------- Custom CUD ------------------------------ */
@Override
protected boolean beforePersist() {
// Set createdOn date _now_
getInstance().setCreatedOn(new Date());
return uploadEditor.beforePersist();
}
@Override
protected boolean beforeUpdate() {
return uploadEditor.beforeUpdate();
}
@Override
public String remove() {
return trash();
}
@Override
protected NodeRemover getNodeRemover() {
return (NodeRemover) Component.getInstance(UploadNodeRemover.class);
}
/* -------------------------- Internal Methods ------------------------------ */
private void initUploadEditor(WikiUpload instance) {
if (uploader != null && uploader.getUpload() != null) {
uploadEditor = uploader.getUploadHandler().createEditor(uploader.getUpload());
} else {
UploadType uploadType = uploadTypes.get(instance.getContentType());
if (uploadType == null) {
getLog().debug("couldn't find upload handler for content type, using generic handler and editor");
uploadType = uploadTypes.get(UploadTypes.GENERIC_UPLOAD_TYPE);
}
uploadEditor = uploadType.getUploadHandler().createEditor(instance);
}
}
/* -------------------------- Messages ------------------------------ */
@Override
protected void createdMessage() {
StatusMessages.instance().addFromResourceBundleOrDefault(
INFO,
"lacewiki.msg.Upload.Persist",
"File '{0}' has been saved.",
getInstance().getName()
);
}
@Override
protected void updatedMessage() {
StatusMessages.instance().addFromResourceBundleOrDefault(
INFO,
"lacewiki.msg.Upload.Update",
"File '{0}' has been updated.",
getInstance().getName()
);
}
@Override
protected void deletedMessage() {
StatusMessages.instance().addFromResourceBundleOrDefault(
INFO,
"lacewiki.msg.Upload.Delete",
"File '{0}' has been deleted.",
getInstance().getName()
);
}
protected void uploadUpdatedMessage() {
StatusMessages.instance().addFromResourceBundleOrDefault(
INFO,
"lacewiki.msg.uploadEdit.UpdateUpload",
"File '{0}' has been uploaded.",
uploader.getFilename()
);
}
protected String getEditorWorkspaceDescription(boolean create) {
if (create) {
return Messages.instance().get("lacewiki.label.uploadEdit.UploadFile");
} else {
return Messages.instance().get("lacewiki.label.uploadEdit.EditFile") + ":" + getInstance().getName();
}
}
/* -------------------------- Public Features ------------------------------ */
public UploadEditor getUploadEditor() {
if (uploadEditor == null) initUploadEditor(getInstance());
return uploadEditor;
}
public void uploadUpdateInstance() {
if (uploader.uploadUpdateInstance(getInstance(), true) != null) {
uploadUpdatedMessage();
}
}
public TagEditor getTagEditor() {
return tagEditor;
}
public List<String> getAvailableImporters() {
if (getInstance().getContentType() == null) return Collections.EMPTY_LIST;
return importerRegistry.getAvailableImporters(getInstance().getContentType(), getInstance().getExtension());
}
public String getImporter() {
return importer;
}
public void setImporter(String importer) {
this.importer = importer;
}
public void importInstance() {
if (importer == null) return;
getLog().debug("importing with importer: " + importer);
Importer imp = (Importer)Component.getInstance(importer);
imp.handleImport(getEntityManager(), getInstance());
getEntityManager().flush();
}
}