/**
* 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;
}
};
}
}