NIHVIVO-161 Make image height and width available to the cropping template.

This commit is contained in:
jeb228 2010-07-01 13:34:50 +00:00
parent 515a7bf687
commit ebba9909fb
2 changed files with 143 additions and 23 deletions

View file

@ -62,6 +62,8 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
public static final String BODY_TITLE = "title"; public static final String BODY_TITLE = "title";
public static final String BODY_ENTITY_NAME = "entityName"; public static final String BODY_ENTITY_NAME = "entityName";
public static final String BODY_MAIN_IMAGE_URL = "imageUrl"; public static final String BODY_MAIN_IMAGE_URL = "imageUrl";
public static final String BODY_MAIN_IMAGE_HEIGHT = "imageHeight";
public static final String BODY_MAIN_IMAGE_WIDTH = "imageWidth";
public static final String BODY_THUMBNAIL_URL = "thumbnailUrl"; public static final String BODY_THUMBNAIL_URL = "thumbnailUrl";
public static final String BODY_CANCEL_URL = "cancelUrl"; public static final String BODY_CANCEL_URL = "cancelUrl";
public static final String BODY_DELETE_URL = "deleteUrl"; public static final String BODY_DELETE_URL = "deleteUrl";
@ -146,10 +148,13 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
VitroRequest vreq = new VitroRequest(request); VitroRequest vreq = new VitroRequest(request);
ResponseValues values = buildTheResponse(vreq); ResponseValues values = buildTheResponse(vreq);
if (values.isForwardResponse()) { switch (values.getType()) {
case FORWARD:
doForward(vreq, response, values); doForward(vreq, response, values);
} else { case TEMPLATE:
doTemplate(vreq, response, values); doTemplate(vreq, response, values);
case EXCEPTION:
doException(vreq, response, values);
} }
} catch (Exception e) { } catch (Exception e) {
log.error("Could not produce response page", e); log.error("Could not produce response page", e);
@ -186,6 +191,15 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
req.getRequestDispatcher(values.getForwardUrl()).forward(req, resp); req.getRequestDispatcher(values.getForwardUrl()).forward(req, resp);
} }
/**
* We processed a response, and need to display an internal exception.
*/
private void doException(VitroRequest vreq, HttpServletResponse resp,
ResponseValues values) {
log.error(values.getException(), values.getException());
doTemplate(vreq, resp, new TemplateResponseValues(TEMPLATE_ERROR));
}
/** /**
* Handle the different actions. If not specified, the default action is to * Handle the different actions. If not specified, the default action is to
* show the intro screen. * show the intro screen.
@ -209,8 +223,7 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
return showAddImagePageWithError(null, e.getMessage()); return showAddImagePageWithError(null, e.getMessage());
} catch (Exception e) { } catch (Exception e) {
// We weren't expecting this - log it, and apologize to the user. // We weren't expecting this - log it, and apologize to the user.
log.error(e, e); return new ExceptionResponseValues(e);
return new TemplateResponseValues(TEMPLATE_ERROR);
} }
} }
@ -257,8 +270,10 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
entity = getWebappDaoFactory().getIndividualDao().getIndividualByURI( entity = getWebappDaoFactory().getIndividualDao().getIndividualByURI(
entityUri); entityUri);
Dimensions mainImageSize = helper.getMainImageSize(entity);
// Go to the cropping page. // Go to the cropping page.
return showCropImagePage(entity, getMainImageUrl(entity)); return showCropImagePage(entity, getMainImageUrl(entity), mainImageSize);
} }
/** /**
@ -393,9 +408,7 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
*/ */
private TemplateResponseValues showAddImagePageWithError(Individual entity, private TemplateResponseValues showAddImagePageWithError(Individual entity,
String message) { String message) {
TemplateResponseValues rv = showAddImagePage(entity); return showAddImagePage(entity).put(BODY_ERROR_MESSAGE, message);
rv.put(BODY_ERROR_MESSAGE, message);
return rv;
} }
/** /**
@ -426,9 +439,11 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
* We got their main image - go to the Crop Image page. * We got their main image - go to the Crop Image page.
*/ */
private TemplateResponseValues showCropImagePage(Individual entity, private TemplateResponseValues showCropImagePage(Individual entity,
String imageUrl) { String imageUrl, Dimensions dimensions) {
TemplateResponseValues rv = new TemplateResponseValues(TEMPLATE_CROP); TemplateResponseValues rv = new TemplateResponseValues(TEMPLATE_CROP);
rv.put(BODY_MAIN_IMAGE_URL, UrlBuilder.getUrl(imageUrl)); rv.put(BODY_MAIN_IMAGE_URL, UrlBuilder.getUrl(imageUrl));
rv.put(BODY_MAIN_IMAGE_HEIGHT, dimensions.height);
rv.put(BODY_MAIN_IMAGE_WIDTH, dimensions.width);
rv.put(BODY_FORM_ACTION, formAction(entity.getURI(), ACTION_SAVE)); rv.put(BODY_FORM_ACTION, formAction(entity.getURI(), ACTION_SAVE));
rv.put(BODY_CANCEL_URL, displayPageUrl(entity.getURI())); rv.put(BODY_CANCEL_URL, displayPageUrl(entity.getURI()));
rv.put(BODY_TITLE, "Crop Photo" + forName(entity)); rv.put(BODY_TITLE, "Crop Photo" + forName(entity));
@ -549,14 +564,30 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
} }
} }
static class Dimensions {
final int width;
final int height;
Dimensions(int width, int height) {
this.width = width;
this.height = height;
}
}
private static interface ResponseValues { private static interface ResponseValues {
boolean isForwardResponse(); enum ResponseType {
TEMPLATE, FORWARD, EXCEPTION
}
ResponseType getType();
String getTemplateName(); String getTemplateName();
Map<? extends String, ? extends Object> getBodyMap(); Map<? extends String, ? extends Object> getBodyMap();
String getForwardUrl(); String getForwardUrl();
Throwable getException();
} }
private static class TemplateResponseValues implements ResponseValues { private static class TemplateResponseValues implements ResponseValues {
@ -567,19 +598,14 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
this.templateName = templateName; this.templateName = templateName;
} }
public void put(String key, Object value) { public TemplateResponseValues put(String key, Object value) {
this.bodyMap.put(key, value); this.bodyMap.put(key, value);
return this;
} }
@Override @Override
public boolean isForwardResponse() { public ResponseType getType() {
return false; return ResponseType.TEMPLATE;
}
@Override
public String getForwardUrl() {
throw new IllegalStateException(
"This is not a forwarding response.");
} }
@Override @Override
@ -592,6 +618,18 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
return this.templateName; return this.templateName;
} }
@Override
public Throwable getException() {
throw new UnsupportedOperationException(
"This is not an exception response.");
}
@Override
public String getForwardUrl() {
throw new UnsupportedOperationException(
"This is not a forwarding response.");
}
} }
private static class ForwardResponseValues implements ResponseValues { private static class ForwardResponseValues implements ResponseValues {
@ -602,8 +640,8 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
} }
@Override @Override
public boolean isForwardResponse() { public ResponseType getType() {
return true; return ResponseType.FORWARD;
} }
@Override @Override
@ -611,14 +649,58 @@ public class ImageUploadController extends FreeMarkerHttpServlet {
return this.forwardUrl; return this.forwardUrl;
} }
@Override
public String getTemplateName() {
throw new UnsupportedOperationException(
"This is not a template response.");
}
@Override
public Map<? extends String, ? extends Object> getBodyMap() {
throw new UnsupportedOperationException(
"This is not a template response.");
}
@Override
public Throwable getException() {
throw new UnsupportedOperationException(
"This is not an exception response.");
}
}
private static class ExceptionResponseValues implements ResponseValues {
private final Throwable cause;
public ExceptionResponseValues(Throwable cause) {
this.cause = cause;
}
@Override
public ResponseType getType() {
return ResponseType.EXCEPTION;
}
@Override
public Throwable getException() {
return cause;
}
@Override
public String getTemplateName() {
throw new UnsupportedOperationException(
"This is not a template response.");
}
@Override @Override
public Map<? extends String, ? extends Object> getBodyMap() { public Map<? extends String, ? extends Object> getBodyMap() {
throw new IllegalStateException("This is not a template response."); throw new IllegalStateException("This is not a template response.");
} }
@Override @Override
public String getTemplateName() { public String getForwardUrl() {
throw new IllegalStateException("This is not a template response."); throw new UnsupportedOperationException(
"This is not a forwarding response.");
} }
} }

View file

@ -11,6 +11,7 @@ import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Collections; import java.util.Collections;
@ -27,6 +28,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.ImageUploadController.Dimensions;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.ImageUploadController.UserMistakeException; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.ImageUploadController.UserMistakeException;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.filestorage.FileModelHelper; import edu.cornell.mannlib.vitro.webapp.filestorage.FileModelHelper;
@ -354,4 +356,40 @@ public class ImageUploadHelper {
ImageIO.write(bdest, "JPG", buffer); ImageIO.write(bdest, "JPG", buffer);
return new ByteArrayInputStream(buffer.toByteArray()); return new ByteArrayInputStream(buffer.toByteArray());
} }
/**
* Find out how big the main image is.
*/
Dimensions getMainImageSize(Individual entity) {
String uri = FileModelHelper.getMainImageBytestreamUri(entity);
String filename = FileModelHelper.getMainImageFilename(entity);
InputStream stream = null;
try {
stream = fileStorage.getInputStream(uri, filename);
BufferedImage image = ImageIO.read(stream);
return new Dimensions(image.getWidth(), image.getHeight());
} catch (FileNotFoundException e) {
log.warn("No main image file for '" + showUri(entity) + "'; name='"
+ filename + "', bytestreamUri='" + uri + "'", e);
return new Dimensions(0, 0);
} catch (IOException e) {
log.warn(
"Can't read main image file for '" + showUri(entity)
+ "'; name='" + filename + "', bytestreamUri='"
+ uri + "'", e);
return new Dimensions(0, 0);
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private String showUri(Individual entity) {
return (entity == null) ? "null" : entity.getURI();
}
} }