package com.processpuzzle.artifact_management.control; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.awt.image.renderable.ParameterBlock; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Calendar; import java.util.List; import javax.imageio.ImageIO; import javax.media.jai.InterpolationNearest; import javax.media.jai.JAI; import javax.media.jai.OpImage; import javax.media.jai.RenderedOp; import org.apache.commons.fileupload.FileItem; import com.processpuzzle.application.configuration.domain.ProcessPuzzleContext; import com.processpuzzle.application.control.control.CommandDispatcher; import com.processpuzzle.application.security.control.AuthorizationException; import com.processpuzzle.artifact.domain.Artifact; import com.processpuzzle.artifact.domain.ArtifactFolder; import com.processpuzzle.artifact.domain.ArtifactFolderRepository; import com.processpuzzle.artifact.domain.DefaultArtifactRepository; import com.processpuzzle.artifact.domain.FileStorage; import com.processpuzzle.artifact.domain.ImageFile; import com.processpuzzle.artifact.domain.ImageFileFactory; import com.processpuzzle.file.control.FileServices; import com.processpuzzle.persistence.domain.DefaultUnitOfWork; import com.processpuzzle.user_session.domain.UserRequestManager; import com.processpuzzle.util.domain.GeneralService; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.media.jai.codec.FileSeekableStream; import com.sun.media.jai.codec.ImageCodec; import com.sun.media.jai.codec.ImageDecoder; import com.sun.media.jai.codec.ImageEncodeParam; import com.sun.media.jai.codec.ImageEncoder; import com.sun.media.jai.codec.SeekableStream; public class AddRelatedArtifactCommand extends ArtifactViewCommand { public static final String ADD_RELATED_ARTIFACT_COMMAND_NAME = "AddRelatedArtifact"; public static final String TARGETARTIFACT_NAME_PARAM = "targetArtifactName"; public static final String TARGETARTIFACT_ID_PARAM = "targetArtifactId"; public static final String TARGETFOLDER_PARAM = "targetFolder"; public static final String UPLOADFORM_NAME_PARAM = "uploadFormName"; public static final String JPEG_CONTENT_TYPE = "image/jpeg"; public static final float scale = 0.2f; public static String UPLOADED_FILE_FOLDER; protected ImageFileFactory imageFileFactory; protected String targetArtifactName; protected String targetArtifactId; protected String targetFolderName; protected Artifact<?> targetArtifact = null; protected ArtifactFolder targetFolder = null; protected String uploadFormName = null; protected String docType = null; protected String docSubType = null; private String filePath; private String fileName; public void init( CommandDispatcher dispatcher ) { super.init( dispatcher ); imageFileFactory = applicationContext.getEntityFactory( ImageFileFactory.class ); UPLOADED_FILE_FOLDER = applicationContext.getProperty( ProcessPuzzleContext.UPLOADED_FILES_FOLDER ); findTargetArtifact( dispatcher ); try{ addRelatedArtifact( dispatcher ); }catch( IOException e ){ e.printStackTrace(); } } protected void retrieveRequestParameters( CommandDispatcher dispatcher ) { super.retrieveRequestParameters( dispatcher ); targetArtifactName = (String) dispatcher.getProperties().getProperty( TARGETARTIFACT_NAME_PARAM ); targetArtifactId = (String) dispatcher.getProperties().getProperty( TARGETARTIFACT_ID_PARAM ); targetFolderName = (String) dispatcher.getProperties().getProperty( TARGETFOLDER_PARAM ); uploadFormName = (String) dispatcher.getProperties().getProperty( UPLOADFORM_NAME_PARAM ); docType = (String) dispatcher.getProperties().getProperty( "docType" ); docSubType = (String) dispatcher.getProperties().getProperty( "docSubType" ); } private void findTargetArtifact( CommandDispatcher dispatcher ) { DefaultUnitOfWork work = new DefaultUnitOfWork( true ); ProcessPuzzleContext applicationContext = UserRequestManager.getInstance().getApplicationContext(); DefaultArtifactRepository artifactRepository = applicationContext.getRepository( DefaultArtifactRepository.class ); ArtifactFolderRepository artifactFolderRepository = applicationContext.getRepository( ArtifactFolderRepository.class ); if( targetArtifactName != null && !targetArtifactName.equals( "" ) ){ targetArtifact = artifactRepository.findByFullName( work, targetArtifactName ); } if( (targetArtifactId != null) && (!targetArtifactId.equals( "" )) ){ targetArtifact = artifactRepository.findById( work, new Integer( targetArtifactId ) ); }else if( (targetFolderName != null) && (!targetFolderName.equals( "" )) ){ targetFolder = (ArtifactFolder) artifactFolderRepository.findByPath( work, targetFolderName ); } work.finish(); } private ImageEncodeParam getJpegEncodeParam() { JPEGEncodeParam encodeParam = null; try{ BufferedImage image = ImageIO.read( new File( filePath )); JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder( new FileOutputStream( filePath ) ); encodeParam = jpegEncoder.getDefaultJPEGEncodeParam( image ); encodeParam.setQuality( 0.99f, false ); encodeParam.setHorizontalSubsampling( 0, 1 ); encodeParam.setHorizontalSubsampling( 1, 1 ); encodeParam.setHorizontalSubsampling( 2, 1 ); encodeParam.setVerticalSubsampling( 0, 1 ); encodeParam.setVerticalSubsampling( 1, 1 ); encodeParam.setVerticalSubsampling( 2, 1 ); }catch( FileNotFoundException e ){ e.printStackTrace(); }catch( IOException e ){ e.printStackTrace(); } return (ImageEncodeParam) encodeParam; } private ImageFile imageToJpeg( ImageFile sourceImage, String jpegPath ) { FileSeekableStream stream = null; try{ stream = new FileSeekableStream( sourceImage.getSource() ); String typeOfImage = GeneralService.getLastToken( sourceImage.getContentType(), "/" ); String originalFileNameWithoutExtension = GeneralService.getFirstToken( sourceImage.getOriginalFileName(), "." ); ImageDecoder dec = ImageCodec.createImageDecoder( typeOfImage, stream, null ); RenderedImage image = dec.decodeAsRenderedImage( 0 ); File outJpgFile = new File( jpegPath + "\\" + originalFileNameWithoutExtension + ".jpg" ); OutputStream f = new FileOutputStream( outJpgFile ); ImageEncoder jpgEnc = ImageCodec.createImageEncoder( "jpeg", f, getJpegEncodeParam() ); jpgEnc.encode( image ); f.flush(); ImageFile jpegImage = imageFileFactory.createImageFile( originalFileNameWithoutExtension + ".jpg" ); jpegImage.setOriginalFileName( originalFileNameWithoutExtension + ".jpg" ); jpegImage.setSource( outJpgFile.getPath() ); jpegImage.setContentType( JPEG_CONTENT_TYPE ); jpegImage.setUploadDate( Calendar.getInstance().getTime() ); jpegImage.setSize( new Long( outJpgFile.length() ) ); return jpegImage; }catch( IOException e ){ return null; } } private ImageFile createThumbnail( ImageFile jpegFile ) { try{ InputStream is = new FileInputStream( jpegFile.getSource() ); SeekableStream s = SeekableStream.wrapInputStream( is, true ); RenderedOp objImage = JAI.create( "stream", s ); ((OpImage) objImage.getRendering()).setTileCache( null ); ParameterBlock pb = new ParameterBlock(); pb.addSource( objImage ); // The source image pb.add( scale ); // The xScale pb.add( scale ); // The yScale pb.add( 0.0F ); // The x translation pb.add( 0.0F ); // The y translation pb.add( new InterpolationNearest() ); // The interpolation objImage = JAI.create( "scale", pb, null ); String originalFileNameWithoutExtension = GeneralService.getFirstToken( jpegFile.getName(), "." ); File outJpgThumbnail = new File( jpegFile.getSourcePath() + "\\" + originalFileNameWithoutExtension + "_thumbnail.jpg" ); OutputStream ft = new FileOutputStream( outJpgThumbnail ); ImageEncoder jpgEncThumbnail = ImageCodec.createImageEncoder( "jpeg", ft, getJpegEncodeParam() ); jpgEncThumbnail.encode( objImage ); ft.flush(); ImageFile jpegImage = imageFileFactory.createImageFile( originalFileNameWithoutExtension + "_thumbnail.jpg" ); jpegImage.setOriginalFileName( originalFileNameWithoutExtension + "_thumbnail.jpg" ); jpegImage.setSource( outJpgThumbnail.getPath() ); jpegImage.setContentType( JPEG_CONTENT_TYPE ); jpegImage.setUploadDate( Calendar.getInstance().getTime() ); jpegImage.setSize( new Long( outJpgThumbnail.length() ) ); jpegImage.setIsInnerPicture( jpegFile.getIsInnerPicture() ); jpegImage.setIsOuterPicture( jpegFile.getIsOuterPicture() ); return jpegImage; }catch( FileNotFoundException e ){}catch( IOException e ){ return null; } return null; } protected void addRelatedArtifact( CommandDispatcher dispatcher ) throws IOException { DefaultUnitOfWork work = new DefaultUnitOfWork( true ); if( loggedInUser != null ){ ProcessPuzzleContext applicationContext = UserRequestManager.getInstance().getApplicationContext(); DefaultArtifactRepository artifactRepository = (DefaultArtifactRepository) applicationContext.getRepository( DefaultArtifactRepository.class ); if( targetArtifact != null ){ subjectArtifact.addRelatedArtifact( targetArtifact ); artifactRepository.update( work, subjectArtifact ); }else if( dispatcher.getRequest().getAttribute( "mmFileItems" ) != null ){ List<?> mmFileItems = (List<?>) dispatcher.getRequest().getAttribute( "mmFileItems" ); FileItem fileItem = FileServices.getFileItemByFieldName( uploadFormName, mmFileItems ); if( fileItem != null ){ if( targetFolder == null ){ targetFolder = (ArtifactFolder) artifactRepository.findById( work, subjectArtifact.getContainingFolder().getId() ); } filePath = dispatcher.getServletContext().getRealPath( UPLOADED_FILE_FOLDER + "\\" + targetFolder.getName() ); FileStorage fileStorage = null; if( docType != null ){ if( docType.equals( "Picture" ) ){ String fileNameWithoutExtension = GeneralService.getFirstToken( GeneralService.getLastToken( fileItem.getName().toString(), "\\" ), "." ); fileName = fileNameWithoutExtension + "_" + System.currentTimeMillis() + ".jpg"; fileStorage = imageFileFactory.createImageFile( fileName ); targetFolder.addChildArtifact( fileStorage ); FileServices.uploadFile( fileItem, fileName, loggedInUser, filePath, fileStorage ); if( fileItem.getContentType().indexOf( "image" ) != -1 ){ ImageFile jpegFile = (ImageFile) fileStorage; if( docSubType.equals( "InnerPic" ) ) jpegFile.setIsInnerPicture( true ); if( docSubType.equals( "OuterPic" ) ) jpegFile.setIsOuterPicture( true ); if( fileStorage.getContentType().indexOf( "jpeg" ) == -1 ){ jpegFile = imageToJpeg( (ImageFile) fileStorage, filePath ); if( jpegFile != null ){ jpegFile.setContainingFolder( targetFolder ); artifactRepository.add( work, jpegFile ); fileStorage.addRelatedArtifact( jpegFile ); } } ImageFile thumbnailOfJpegImage = createThumbnail( jpegFile ); if( thumbnailOfJpegImage != null ){ thumbnailOfJpegImage.setContainingFolder( targetFolder ); artifactRepository.add( work, thumbnailOfJpegImage ); fileStorage.addRelatedArtifact( thumbnailOfJpegImage ); } } subjectArtifact.addRelatedArtifact( fileStorage ); artifactRepository.update( work, subjectArtifact ); artifactRepository.update( work, targetFolder ); }else if( docType.equals( "Document" ) ){ String fileNameWithoutExtension = GeneralService.getFirstToken( GeneralService.getLastToken( fileItem.getName().toString(), "\\" ), "." ); String name = fileNameWithoutExtension + "_" + System.currentTimeMillis() + "." + GeneralService.getLastToken( GeneralService.getLastToken( fileItem.getName().toString(), "\\" ), "." ); fileStorage = FileStorage.create( name, loggedInUser ); targetFolder.addChildArtifact( fileStorage ); FileServices.uploadFile( fileItem, name, loggedInUser, filePath, fileStorage ); subjectArtifact.addRelatedArtifact( fileStorage ); artifactRepository.add( work, fileStorage ); artifactRepository.update( work, subjectArtifact ); artifactRepository.update( work, targetFolder ); } } } work.finish(); } }else throw new AuthorizationException( loggedInUser.getUserName(), AddRelatedArtifactCommand.class.getSimpleName() ); } public String execute( CommandDispatcher dispatcher ) throws Exception { return subjectArtifactView.getType().getPresentationUri(); } protected void retrieveResponseDocument() {} }