/** * Copyright 2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.bricket.plugin.picture.web; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Locale; import org.apache.commons.io.IOUtils; import org.apache.wicket.RequestCycle; import org.apache.wicket.ResourceReference; import org.apache.wicket.injection.web.InjectorHolder; import org.apache.wicket.markup.html.DynamicWebResource; import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.util.time.Time; import org.apache.wicket.util.value.ValueMap; import org.bricket.plugin.picture.service.PictureModificationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The static Url methods are creating urls like this: * http://[servername]/[appname * ]/resources/org.apache.wicket.Application//pictureResource?id=[digest] * http://[servername]/[appname]/resources/org.apache.wicket.Application// * pictureResource?id=[digest]&layout * http://[servername]/[appname]/resources/org * .apache.wicket.Application//pictureResource?id=[digest]&thumb * * Diese Urls are bookmarkeable. * * @author Ingo Renner * @author Henning Teek * */ public class PictureResource extends DynamicWebResource { private final Logger log = LoggerFactory.getLogger(PictureResource.class); private static final String LAYOUT = "layout"; private static final String THUMB = "thumb"; private static final String ID = "id"; @SpringBean private PictureModificationService pictureModificationService; protected static final String FORMAT = "jpg"; public static final String PICTURE_RESOURCE = "/pictureResource"; public PictureResource() { super(); log.info("injecting 1"); InjectorHolder.getInjector().inject(this); } public PictureResource(Locale local) { super(local); log.info("injecting 2"); InjectorHolder.getInjector().inject(this); } public static String getUrl(String digest) { final ResourceReference imageResource = new ResourceReference(PICTURE_RESOURCE); return RequestCycle.get().urlFor(imageResource) + "?" + ID + "=" + digest; } public static String getLayoutUrl(String digest) { ResourceReference imageResource = new ResourceReference(PICTURE_RESOURCE); return RequestCycle.get().urlFor(imageResource) + "?" + ID + "=" + digest + "&" + LAYOUT; } public static String getThumbnailUrl(String digest) { ResourceReference imageResource = new ResourceReference(PICTURE_RESOURCE); return RequestCycle.get().urlFor(imageResource) + "?" + ID + "=" + digest + "&" + THUMB; } private File getImageFile(ValueMap params) { log.info("injecting getImageFile"); InjectorHolder.getInjector().inject(this); if (params.containsKey(ID)) { final String digest = params.getString(ID); log.info("digest=" + digest); log.info("pictureModificationService=" + pictureModificationService); if (isThumbnail(params)) { return pictureModificationService.getThumbnailImage(digest); } else { if (isLayout(params)) { return pictureModificationService.getLayoutImage(digest); } else { return pictureModificationService.getImage(digest); } } } return null; } private boolean isThumbnail(ValueMap params) { return params.containsKey(THUMB); } private boolean isLayout(ValueMap params) { return params.containsKey(LAYOUT); } protected byte[] getImageData() { ValueMap params = getParameters(); File file = getImageFile(params); if (file != null) { try { return IOUtils.toByteArray(new FileInputStream(file)); } catch (FileNotFoundException e) { log.error("file not found", e); } catch (IOException e) { log.error("io error", e); } } log.error("No image data available."); return new byte[0]; } protected Time getImageLastModified() { ValueMap params = getParameters(); File file = getImageFile(params); if (file != null) { return Time.valueOf(file.lastModified()); } return null; } @Override protected synchronized ResourceState getResourceState() { return new ResourceState() { private byte[] imageData; @Override public Time lastModifiedTime() { if (lastModifiedTime == null) { lastModifiedTime = getImageLastModified(); if (lastModifiedTime == null) { lastModifiedTime = Time.now(); } } return lastModifiedTime; } @Override public byte[] getData() { if (imageData == null) { imageData = getImageData(); } return imageData; } @Override public String getContentType() { return "image/" + FORMAT; } }; } }