Created
October 10, 2011 14:08
-
-
Save kritzikratzi/1275419 to your computer and use it in GitHub Desktop.
Another way to use play-morphia blobs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package models; | |
import java.awt.image.BufferedImage; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import javax.imageio.ImageIO; | |
import play.libs.MimeTypes; | |
import play.modules.morphia.Blob; | |
import play.modules.morphia.Model; | |
import play.modules.morphia.MorphiaPlugin; | |
import utils.ImageUtils; | |
import com.google.code.morphia.annotations.Entity; | |
import com.mongodb.gridfs.GridFSDBFile; | |
import com.mongodb.gridfs.GridFSInputFile; | |
/** | |
* You must think of ImageBlob of an immutable object. | |
* Once created you cannot really modify it. | |
* | |
* @author hansi | |
*/ | |
@Entity | |
public class ImageBlob extends Model{ | |
// the original filename | |
public String filename; | |
// the original image data ... | |
public Blob data; | |
public ImageBlob(){ | |
} | |
public ImageBlob( InputStream body, String filename ){ | |
this.filename = filename; | |
data = new Blob( body, MimeTypes.getContentType( filename ) ); | |
} | |
public GridFSDBFile asAvatar(){ | |
// Is there already a file for this? | |
String filename = getId().toString() + "_avatar"; | |
GridFSDBFile avatar = MorphiaPlugin.gridFs().findOne( filename ); | |
if( avatar != null ){ | |
return avatar; | |
} | |
else{ | |
try { | |
BufferedImage originalImage = ImageIO.read( data.getGridFSFile().getInputStream() ); | |
BufferedImage avatarImage = ImageUtils.generateAvatar( originalImage ); | |
InputStream in = ImageUtils.toInputStream( avatarImage, "png" ); | |
GridFSInputFile input = MorphiaPlugin.gridFs().createFile( in, filename ); | |
System.out.println( "name = " + filename ); | |
input.save(); | |
return MorphiaPlugin.gridFs().findOne( filename ); | |
} | |
catch (IOException e) { | |
e.printStackTrace(); | |
return null; | |
} | |
} | |
} | |
public GridFSDBFile asPanorama(){ | |
// Is there already a file for this? | |
String filename = getId().toString() + "_panorama"; | |
GridFSDBFile panorama = MorphiaPlugin.gridFs().findOne( filename ); | |
if( panorama != null ){ | |
return panorama; | |
} | |
else{ | |
try { | |
BufferedImage originalImage = ImageIO.read( data.getGridFSFile().getInputStream() ); | |
BufferedImage avatarImage = ImageUtils.fit( originalImage, 500, 350 ); | |
InputStream in = ImageUtils.toInputStream( avatarImage, "jpg" ); | |
GridFSInputFile input = MorphiaPlugin.gridFs().createFile( in, filename ); | |
System.out.println( "name = " + filename ); | |
input.save(); | |
return MorphiaPlugin.gridFs().findOne( filename ); | |
} | |
catch (IOException e) { | |
e.printStackTrace(); | |
return null; | |
} | |
} | |
} | |
} | |
package models; | |
import java.lang.annotation.Annotation; | |
import java.lang.reflect.Type; | |
import play.data.binding.Global; | |
import play.data.binding.TypeBinder; | |
/** | |
* This is a HUGE HUGE help! | |
* It allows you to pass in morphia references to image blobs via get/post parameters, | |
* e.g. you could pass | |
* http://host:9000/my/action?obj.title=test&obj.images=4e91eb53804cc3de71a46703&obj.images=4e91edcd804cc3de71a46711 | |
* | |
* then the vcard should be properly initiated with a list of imageblobs | |
* | |
* @author hansi | |
* | |
*/ | |
@Global | |
public class ImageBlobBinder implements TypeBinder<ImageBlob>{ | |
@Override | |
public Object bind(String name, Annotation[] annotations, String value, | |
Class actualClass, Type genericType) throws Exception { | |
return ImageBlob.findById( value ); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment