User: vietj Date: 04/05/15 16:24:34 Added: nukes/src/main/org/jboss/nukes/core/modules/html/commands AbstractCommand.java CopyCommand.java DeleteCommand.java FileCommand.java MakeProdCommand.java MoveCommand.java RenameCommand.java StoreCommand.java UnmakeProdCommand.java Log: Moved command out of the FileEJB and make them use the command framework Revision Changes Path 1.1 nukes/nukes/src/main/org/jboss/nukes/core/modules/html/commands/AbstractCommand.java Index: AbstractCommand.java =================================================================== /*************************************** * * * Nukes: The OpenSource CMS * * * * Distributable under GPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.nukes.core.modules.html.commands; import org.jboss.nukes.common.command.Command; import org.jboss.nukes.common.command.Configurator; import org.jboss.nukes.common.command.ReflectedConfigurator; import org.jboss.nukes.core.ejb.FileEJBLocalHome; import org.apache.log4j.Logger; /** * @author <a href="mailto:ju...@jb...">Julien Viet</a> * @version $Revision: 1.1 $ */ public abstract class AbstractCommand implements Command { protected Logger log = Logger.getLogger(getClass()); private Configurator cfg = new ReflectedConfigurator(this); public FileEJBLocalHome home; protected AbstractCommand(FileEJBLocalHome home) { this.home = home; } public Configurator getConfigurator() { return cfg; } } 1.1 nukes/nukes/src/main/org/jboss/nukes/core/modules/html/commands/CopyCommand.java Index: CopyCommand.java =================================================================== /*************************************** * * * Nukes: The OpenSource CMS * * * * Distributable under GPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.nukes.core.modules.html.commands; import org.jboss.nukes.core.FileException; import org.jboss.nukes.core.InvalidNameException; import org.jboss.nukes.core.DuplicateFileException; import org.jboss.nukes.core.ejb.FileEJBLocalHome; import org.jboss.nukes.core.ejb.FileEJB; import org.jboss.nukes.core.ejb.FileEJBLocal; import org.jboss.nukes.common.command.Result; import jregex.Matcher; /** * @author <a href="mailto:ju...@jb...">Julien Viet</a> * @version $Revision: 1.1 $ */ public class CopyCommand extends FileCommand { private String dir; private String name; public CopyCommand(FileEJBLocalHome home, String sourceFileId, final String dir, final String name) throws FileException { super(home, sourceFileId); // Finish state setup this.dir = dir; this.name = name; } protected void init() throws FileException { // Check the new dir is valid if (!FileEJB.DIR.matches(dir)) { throw new InvalidNameException(dir); } // Check the new name is valid if (!FileEJB.NAME.matches(name)) { throw new InvalidNameException(name); } super.init(); } void validate(Matcher fileIdMatcher) throws Exception { // Compute the new fileId and verify that no target already exists targetFileId = dir + name; if (home.findByFileId(targetFileId).size() > 0) { throw new DuplicateFileException(targetFileId); } } protected Result perform(FileEJBLocal file, boolean last) throws Exception { home.create(targetFileId, file.getOwner(), file.getContentType(), file.getContent(), file.getCreationDate(), file.getPublic()); return null; } } 1.1 nukes/nukes/src/main/org/jboss/nukes/core/modules/html/commands/DeleteCommand.java Index: DeleteCommand.java =================================================================== /*************************************** * * * Nukes: The OpenSource CMS * * * * Distributable under GPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.nukes.core.modules.html.commands; import org.jboss.nukes.core.ejb.FileEJBLocalHome; import org.jboss.nukes.core.ejb.FileEJBLocal; import org.jboss.nukes.common.command.Result; /** * @author <a href="mailto:ju...@jb...">Julien Viet</a> * @version $Revision: 1.1 $ */ public class DeleteCommand extends FileCommand { public DeleteCommand(FileEJBLocalHome home, String sourceFileId) { super(home, sourceFileId); } public DeleteCommand(FileEJBLocalHome home, String sourceFileId, Integer[] ids) { super(home, sourceFileId, ids); } protected Result perform(FileEJBLocal file, boolean last) throws Exception { file.remove(); return null; } } 1.1 nukes/nukes/src/main/org/jboss/nukes/core/modules/html/commands/FileCommand.java Index: FileCommand.java =================================================================== /*************************************** * * * Nukes: The OpenSource CMS * * * * Distributable under GPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.nukes.core.modules.html.commands; import org.jboss.nukes.core.ejb.FileEJBLocalHome; import org.jboss.nukes.core.ejb.FileEJB; import org.jboss.nukes.core.ejb.FileEJBLocal; import org.jboss.nukes.core.FileException; import org.jboss.nukes.core.FileNotFoundException; import org.jboss.nukes.core.InvalidNameException; import org.jboss.nukes.core.UnexpectedFileException; import org.jboss.nukes.common.command.Result; import javax.ejb.FinderException; import java.util.Collection; import java.util.Iterator; import jregex.Matcher; /** * @author <a href="mailto:ju...@jb...">Julien Viet</a> * @version $Revision: 1.1 $ */ public abstract class FileCommand extends AbstractCommand { protected String sourceFileId; protected Integer[] sourceIds; protected String targetFileId; protected Integer[] targetIds; protected Collection files; public FileCommand(FileEJBLocalHome home, String sourceFileId, Integer sourceId) { this(home, sourceFileId, new Integer[]{sourceId}); } public FileCommand(FileEJBLocalHome home, String sourceFileId, Integer[] sourceIds) { super(home); this.sourceFileId = sourceFileId; this.targetFileId = null; this.sourceIds = sourceIds; this.targetIds = null; this.files = null; } public FileCommand(FileEJBLocalHome home, String sourceFileId) { super(home); this.sourceFileId = sourceFileId; this.targetFileId = null; this.sourceIds = null; this.targetIds = null; this.files = null; } public String getTargetFileId() { return targetFileId; } public Integer[] getTargetIds() { return targetIds; } protected void init() throws FileException { try { if (sourceIds == null) { files = home.findByFileId(sourceFileId); } else { StringBuffer jbossQL = new StringBuffer("SELECT OBJECT(f) FROM file AS f WHERE 1=0"); for (int i = 0; i < sourceIds.length; i++) { jbossQL.append(" OR f.id=").append(sourceIds[i]); } files = home.selectGeneric(jbossQL.toString(), new Object[0]); } } catch(FinderException e) { String message = ""; if (sourceIds != null) { StringBuffer tmp = new StringBuffer("("); for (int i = sourceIds.length - 1;i >= 0;i--) { tmp.append(sourceIds[i]).append(i > 0 ? "," : ")"); } message = tmp.toString(); } else { message = sourceFileId; } throw new FileNotFoundException(message); } } public final Result execute() throws FileException, UnexpectedFileException { try { init(); log.debug("Beginning mass file operation"); // Perform validation of the file id Matcher fileIdMatcher = FileEJB.FILE.matcher(); if (!fileIdMatcher.matches(sourceFileId)) { throw new InvalidNameException(sourceFileId); } else { validate(fileIdMatcher); } // Check we have file if (files.size() == 0) { throw new FileNotFoundException(sourceFileId); } // Check they are the same for (Iterator i = files.iterator();i.hasNext();) { FileEJBLocal file = (FileEJBLocal)i.next(); if (!file.getFileId().equals(sourceFileId)) { throw new FileNotFoundException(sourceFileId); } } // The last result which is the significant one Result result = null; // Finally perform operation for (Iterator i = files.iterator();i.hasNext();) { FileEJBLocal file = (FileEJBLocal)i.next(); log.debug("Performing operation on " + " " + sourceFileId + " " + file.getId()); result = perform(file, i.hasNext()); } return result; } catch(FileException e) { // ctx.setRollbackOnly(); throw e; } catch(Exception e) { // ctx.setRollbackOnly(); log.error("Exception during mass operation", e); throw new UnexpectedFileException(e); } } void validate(Matcher fileIdMatcher) throws Exception { } protected abstract Result perform(FileEJBLocal file, boolean last) throws Exception; } 1.1 nukes/nukes/src/main/org/jboss/nukes/core/modules/html/commands/MakeProdCommand.java Index: MakeProdCommand.java =================================================================== /*************************************** * * * Nukes: The OpenSource CMS * * * * Distributable under GPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.nukes.core.modules.html.commands; import org.jboss.nukes.core.ejb.FileEJBLocalHome; import org.jboss.nukes.core.ejb.FileEJBLocal; import org.jboss.nukes.common.command.Result; import java.util.Iterator; /** * @author <a href="mailto:ju...@jb...">Julien Viet</a> * @version $Revision: 1.1 $ */ public class MakeProdCommand extends FileCommand { public MakeProdCommand(FileEJBLocalHome home, String sourceFileId, Integer id) { super(home, sourceFileId, id); } protected Result perform(FileEJBLocal file, boolean last) throws Exception { for (Iterator i = home.findPublicByFileId(sourceFileId).iterator();i.hasNext();) { FileEJBLocal temp = (FileEJBLocal)i.next(); temp.setPublic(false); } file.setPublic(true); return null; } } 1.1 nukes/nukes/src/main/org/jboss/nukes/core/modules/html/commands/MoveCommand.java Index: MoveCommand.java =================================================================== /*************************************** * * * Nukes: The OpenSource CMS * * * * Distributable under GPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.nukes.core.modules.html.commands; import org.jboss.nukes.core.ejb.FileEJBLocalHome; import org.jboss.nukes.core.ejb.FileEJB; import org.jboss.nukes.core.ejb.FileEJBLocal; import org.jboss.nukes.core.FileException; import org.jboss.nukes.core.InvalidNameException; import org.jboss.nukes.core.DuplicateFileException; import org.jboss.nukes.common.command.Result; import jregex.Matcher; /** * @author <a href="mailto:ju...@jb...">Julien Viet</a> * @version $Revision: 1.1 $ */ public class MoveCommand extends FileCommand { private String dir; public MoveCommand(FileEJBLocalHome home, String sourceFileId, final String dir) { super(home, sourceFileId); this.dir = dir; } protected void init() throws FileException { // Check the new name validity if (!FileEJB.DIR.matches(dir)) { throw new InvalidNameException(dir); } super.init(); } void validate(Matcher fileIdMatcher) throws Exception { // Compute the new fileId and verify that no target already exists targetFileId = dir + fileIdMatcher.group(2); if (home.findByFileId(targetFileId).size() > 0) { throw new DuplicateFileException(targetFileId); } } protected Result perform(FileEJBLocal file, boolean last) throws Exception { file.setFileId(targetFileId); return null; } } 1.1 nukes/nukes/src/main/org/jboss/nukes/core/modules/html/commands/RenameCommand.java Index: RenameCommand.java =================================================================== /*************************************** * * * Nukes: The OpenSource CMS * * * * Distributable under GPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.nukes.core.modules.html.commands; import org.jboss.nukes.core.ejb.FileEJBLocalHome; import org.jboss.nukes.core.ejb.FileEJB; import org.jboss.nukes.core.ejb.FileEJBLocal; import org.jboss.nukes.core.FileException; import org.jboss.nukes.core.InvalidNameException; import org.jboss.nukes.core.DuplicateFileException; import org.jboss.nukes.common.command.Result; import jregex.Matcher; /** * @author <a href="mailto:ju...@jb...">Julien Viet</a> * @version $Revision: 1.1 $ */ public class RenameCommand extends FileCommand { private String name; public RenameCommand(FileEJBLocalHome home, String sourceFileId, String name) { super(home, sourceFileId); this.name = name; } protected void init() throws FileException { // Check the new name validity if (!FileEJB.NAME.matches(name)) { throw new InvalidNameException(name); } super.init(); } void validate(Matcher fileIdMatcher) throws Exception { targetFileId = fileIdMatcher.group(1) + name; if (home.findByFileId(targetFileId).size() > 0) { throw new DuplicateFileException(targetFileId); } } protected Result perform(FileEJBLocal file, boolean last) throws Exception { file.setFileId(targetFileId); return null; } } 1.1 nukes/nukes/src/main/org/jboss/nukes/core/modules/html/commands/StoreCommand.java Index: StoreCommand.java =================================================================== /*************************************** * * * Nukes: The OpenSource CMS * * * * Distributable under GPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.nukes.core.modules.html.commands; import org.jboss.nukes.core.ejb.UserEJBLocal; import org.jboss.nukes.core.ejb.FileEJB; import org.jboss.nukes.core.ejb.FileEJBLocalHome; import org.jboss.nukes.core.ejb.FileEJBLocal; import org.jboss.nukes.core.FileException; import org.jboss.nukes.core.InvalidNameException; import org.jboss.nukes.core.FileNotFoundException; import org.jboss.nukes.core.UnexpectedFileException; import org.jboss.nukes.core.modules.html.HTMLResultType; import org.jboss.nukes.common.command.Result; import org.jboss.nukes.common.command.SimpleResult; import javax.ejb.ObjectNotFoundException; import javax.ejb.CreateException; import javax.ejb.FinderException; import java.util.Iterator; /** * @author <a href="mailto:ju...@jb...">Julien Viet</a> * @version $Revision: 1.1 $ */ public class StoreCommand extends AbstractCommand { private Integer id; private String fileId; private String contentType; private byte[] content; private UserEJBLocal owner; private boolean makeProd; private Integer targetId; public StoreCommand(FileEJBLocalHome home, Integer id, String fileId, String contentType, byte[] content, UserEJBLocal owner, boolean makeProd) { super(home); this.id = id; this.fileId = fileId; this.contentType = contentType; this.content = content; this.owner = owner; this.makeProd = makeProd; } public Integer getTargetId() { return targetId; } public Result execute() throws FileException, UnexpectedFileException { try { // Perform validation if (content == null) { throw new UnexpectedFileException("Content must not be null"); } if (contentType == null) { throw new UnexpectedFileException("Cannot create a new file without a content type"); } if (!FileEJB.FILE.matches(fileId)) { throw new InvalidNameException(fileId); } // FileEJBLocal file = null; if (id != null) { // If the id is not null that means we want to update a file file = home.findByPrimaryKey(id); // Check the file id are equals if (!file.getFileId().equals(fileId)) { throw new UnexpectedFileException("File names does not match"); } // Update content file.setContent(content); } else { // Otherwise that means we want to create a new version file = home.create(fileId, owner, contentType, content, false); } // If we need to make prod, first we must set all other versions to not public if (makeProd) { for (Iterator i = home.findPublicByFileId(fileId).iterator();i.hasNext();) { FileEJBLocal tmp = (FileEJBLocal)i.next(); tmp.setPublic(false); } // And finally set that version as public file.setPublic(true); } // This is the file that has been touched targetId = file.getId(); return new SimpleResult(HTMLResultType.FILE_STORED); } catch (ObjectNotFoundException e) { throw new FileNotFoundException(id.toString()); } catch (CreateException e) { log.error("Cannot create file", e); throw new UnexpectedFileException("Cannot create file"); } catch (FinderException e) { log.error("Cannot find file", e); throw new UnexpectedFileException("Cannot find file"); } } } 1.1 nukes/nukes/src/main/org/jboss/nukes/core/modules/html/commands/UnmakeProdCommand.java Index: UnmakeProdCommand.java =================================================================== /*************************************** * * * Nukes: The OpenSource CMS * * * * Distributable under GPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.nukes.core.modules.html.commands; import org.jboss.nukes.core.ejb.FileEJBLocalHome; import org.jboss.nukes.core.ejb.FileEJBLocal; import org.jboss.nukes.common.command.Result; /** * @author <a href="mailto:ju...@jb...">Julien Viet</a> * @version $Revision: 1.1 $ */ public class UnmakeProdCommand extends FileCommand { public UnmakeProdCommand(FileEJBLocalHome home, String sourceFileId, Integer[] sourceIds) { super(home, sourceFileId, sourceIds); } protected Result perform(FileEJBLocal file, boolean last) throws Exception { file.setPublic(false); return null; } } |