X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FUploadImagePage.java;h=0dcdd3ab4617bbb7eb51662f0346bc61760beb02;hb=414ee1b03f7155ccb5049ede303dd01020ddcd94;hp=e0aa1e18a95e7290816b012f86e940608c3bff1b;hpb=38cb6c5ec82298ee351d0eb15ddd8331db273af2;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/web/UploadImagePage.java b/src/main/java/net/pterodactylus/sone/web/UploadImagePage.java index e0aa1e1..0dcdd3a 100644 --- a/src/main/java/net/pterodactylus/sone/web/UploadImagePage.java +++ b/src/main/java/net/pterodactylus/sone/web/UploadImagePage.java @@ -1,5 +1,5 @@ /* - * Sone - UploadImagePage.java - Copyright © 2011 David Roden + * Sone - UploadImagePage.java - Copyright © 2011–2013 David Roden * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,15 +17,18 @@ package net.pterodactylus.sone.web; +import java.awt.Dimension; import java.awt.Image; +import java.awt.image.ImageObserver; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; - import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; @@ -33,16 +36,20 @@ import javax.imageio.stream.ImageInputStream; import net.pterodactylus.sone.data.Album; import net.pterodactylus.sone.data.Sone; import net.pterodactylus.sone.data.TemporaryImage; +import net.pterodactylus.sone.text.TextFilter; import net.pterodactylus.sone.web.page.FreenetRequest; import net.pterodactylus.util.io.Closer; -import net.pterodactylus.util.io.StreamCopier; import net.pterodactylus.util.logging.Logging; import net.pterodactylus.util.template.Template; import net.pterodactylus.util.template.TemplateContext; import net.pterodactylus.util.web.Method; + import freenet.support.api.Bucket; import freenet.support.api.HTTPUploadedFile; +import com.google.common.base.Optional; +import com.google.common.io.ByteStreams; + /** * Page implementation that lets the user upload an image. * @@ -78,12 +85,12 @@ public class UploadImagePage extends SoneTemplatePage { if (request.getMethod() == Method.POST) { Sone currentSone = getCurrentSone(request.getToadletContext()); String parentId = request.getHttpRequest().getPartAsStringFailsafe("parent", 36); - Album parent = webInterface.getCore().getAlbum(parentId, false); - if (parent == null) { + Optional parent = webInterface.getCore().getAlbum(parentId); + if (!parent.isPresent()) { /* TODO - signal error */ return; } - if (!currentSone.equals(parent.getSone())) { + if (!currentSone.equals(parent.get().getSone())) { /* TODO - signal error. */ return; } @@ -98,7 +105,7 @@ public class UploadImagePage extends SoneTemplatePage { imageInputStream = fileBucket.getInputStream(); /* TODO - check length */ imageDataOutputStream = new ByteArrayOutputStream((int) fileBucket.size()); - StreamCopier.copy(imageInputStream, imageDataOutputStream); + ByteStreams.copy(imageInputStream, imageDataOutputStream); } catch (IOException ioe1) { logger.log(Level.WARNING, "Could not read uploaded image!", ioe1); return; @@ -118,9 +125,10 @@ public class UploadImagePage extends SoneTemplatePage { return; } String mimeType = getMimeType(imageData); - TemporaryImage temporaryImage = webInterface.getCore().createTemporaryImage(mimeType, imageData); - image = webInterface.getCore().createImage(currentSone, parent, temporaryImage); - image.setTitle(name).setDescription(description).setWidth(uploadedImage.getWidth(null)).setHeight(uploadedImage.getHeight(null)); + Dimension imageSize = getImageDimensions(uploadedImage); + TemporaryImage temporaryImage = webInterface.getCore().createTemporaryImage(mimeType, imageData, imageSize.width, imageSize.height); + image = webInterface.getCore().createImage(currentSone, parent.get(), temporaryImage); + image.modify().setTitle(name).setDescription(TextFilter.filter(request.getHttpRequest().getHeader("host"), description)).update(); } catch (IOException ioe1) { logger.log(Level.WARNING, "Could not read uploaded image!", ioe1); return; @@ -128,8 +136,38 @@ public class UploadImagePage extends SoneTemplatePage { Closer.close(imageDataInputStream); Closer.flush(uploadedImage); } - throw new RedirectException("imageBrowser.html?album=" + parent.getId()); + throw new RedirectException("imageBrowser.html?album=" + parent.get().getId()); + } + } + + private static Dimension getImageDimensions(Image uploadedImage) { + final CountDownLatch widthHeightLatch = new CountDownLatch(2); + final AtomicInteger finalWidth = new AtomicInteger(); + final AtomicInteger finalHeight = new AtomicInteger(); + ImageObserver imageObserver = new ImageObserver() { + @Override + public boolean imageUpdate(Image image, int infoFlags, int x, int y, int width, int height) { + if ((infoFlags & WIDTH) != 0) { + finalWidth.set(width); + widthHeightLatch.countDown(); + } + if ((infoFlags & HEIGHT) != 0) { + finalHeight.set(width); + widthHeightLatch.countDown(); + } + return (infoFlags & ALLBITS) != 0; + } + }; + finalWidth.set(uploadedImage.getWidth(imageObserver)); + finalHeight.set(uploadedImage.getHeight(imageObserver)); + while ((finalWidth.get() == -1) || (finalHeight.get() == -1)) { + try { + widthHeightLatch.await(); + } catch (InterruptedException ie1) { + logger.log(Level.WARNING, "Interrupted while waiting for latch..."); + } } + return new Dimension(finalWidth.get(), finalHeight.get()); } // @@ -144,7 +182,7 @@ public class UploadImagePage extends SoneTemplatePage { * @return The MIME type of the image, or “application/octet-stream” if the * image type could not be detected */ - private String getMimeType(byte[] imageData) { + private static String getMimeType(byte[] imageData) { ByteArrayInputStream imageDataInputStream = new ByteArrayInputStream(imageData); try { ImageInputStream imageInputStream = ImageIO.createImageInputStream(imageDataInputStream);