You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by mi...@apache.org on 2010/06/30 14:55:13 UTC
svn commit: r959293 - in /incubator/clerezza: issues/CLEREZZA-248/
trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/
trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.c...
Author: mir
Date: Wed Jun 30 12:55:12 2010
New Revision: 959293
URL: http://svn.apache.org/viewvc?rev=959293&view=rev
Log:
CLEREZZA-248: merged issue with trunk, because the feature is needed.
Removed:
incubator/clerezza/issues/CLEREZZA-248/
Modified:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/ (props changed)
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/ (props changed)
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.clerezza.platform.content.representations.core/src/main/java/org/apache/clerezza/platform/content/representations/core/AlternativeRepresentationGenerator.java
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.clerezza.platform.content.representations.core/src/main/java/org/apache/clerezza/platform/content/representations/core/ThumbnailService.java
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/InfoDiscobit.java
Propchange: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jun 30 12:55:12 2010
@@ -2,6 +2,7 @@
/incubator/clerezza/issues/CLEREZZA-113/org.apache.clerezza.platform.content:908544-911013
/incubator/clerezza/issues/CLEREZZA-119/org.apache.clerezza.platform.content:917505-924213
/incubator/clerezza/issues/CLEREZZA-129/org.apache.clerezza.platform.content:917938-918563
+/incubator/clerezza/issues/CLEREZZA-248/org.apache.clerezza.platform.content:958551-959023
/incubator/clerezza/issues/CLEREZZA-25/org.apache.clerezza.platform.content:891178-892849
/incubator/clerezza/issues/CLEREZZA-65/org.apache.clerezza.platform.content:897875-897920
/incubator/clerezza/issues/CLEREZZA-70/org.apache.clerezza.platform.content:897917-903631
Propchange: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jun 30 12:55:12 2010
@@ -1,2 +1,3 @@
/incubator/clerezza/issues/CLEREZZA-126/org.apache.clerezza.platform.content.representations:910212-916002
+/incubator/clerezza/issues/CLEREZZA-248/org.apache.clerezza.platform.content.representations:958551-959023
/incubator/clerezza/issues/CLEREZZA-38/org.apache.clerezza.platform.content.representations:893127-895998
Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.clerezza.platform.content.representations.core/src/main/java/org/apache/clerezza/platform/content/representations/core/AlternativeRepresentationGenerator.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.clerezza.platform.content.representations.core/src/main/java/org/apache/clerezza/platform/content/representations/core/AlternativeRepresentationGenerator.java?rev=959293&r1=959292&r2=959293&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.clerezza.platform.content.representations.core/src/main/java/org/apache/clerezza/platform/content/representations/core/AlternativeRepresentationGenerator.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.clerezza.platform.content.representations.core/src/main/java/org/apache/clerezza/platform/content/representations/core/AlternativeRepresentationGenerator.java Wed Jun 30 12:55:12 2010
@@ -22,9 +22,11 @@ import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.util.concurrent.locks.Lock;
import javax.imageio.ImageIO;
import javax.ws.rs.core.MediaType;
import org.apache.clerezza.platform.content.DiscobitsHandler;
+import org.apache.clerezza.platform.content.InfoDiscobit;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
@@ -34,6 +36,7 @@ import org.apache.clerezza.utils.imagepr
import org.apache.clerezza.rdf.ontologies.DISCOBITS;
import org.apache.clerezza.rdf.utils.GraphNode;
import org.apache.clerezza.rdf.metadata.MetaDataGenerator;
+import org.apache.felix.scr.annotations.Services;
import org.osgi.service.component.ComponentContext;
import org.osgi.util.tracker.ServiceTracker;
@@ -47,7 +50,11 @@ import org.osgi.util.tracker.ServiceTrac
* @author mir
*/
@Component(metatype=true)
-@Service(MetaDataGenerator.class)
+@Services({
+ @Service(MetaDataGenerator.class),
+ @Service(AlternativeRepresentationGenerator.class)
+})
+
public class AlternativeRepresentationGenerator implements MetaDataGenerator {
private static class Resolution {
@@ -67,6 +74,17 @@ public class AlternativeRepresentationGe
height = new Integer(widthAndHeight[1]);
}
+ /**
+ * A Resolution with the specified width and height.
+ *
+ * @param width
+ * @param height
+ */
+ public Resolution(int width, int height) {
+ this.width = width;
+ this.height = height;
+ }
+
public int getHeight() {
return height;
}
@@ -130,28 +148,59 @@ public class AlternativeRepresentationGe
return;
}
if (mediaType.getType().startsWith("image")) {
- try {
- isAltRepresentation.set(Boolean.TRUE);
- BufferedImage buffImage = ImageIO.read(new ByteArrayInputStream(data));
- int imgWidth = buffImage.getWidth();
- int imgHeigth = buffImage.getHeight();
- for (Resolution resolution : resolutions) {
- if (imgWidth > resolution.getWidth() ||
- imgHeigth > resolution.getHeight()){
- BufferedImage alternativeImage = imageProcessor.makeAThumbnail(
- buffImage, resolution.getWidth(), resolution.getHeight());
- byte[] alternativeImageBytes = bufferedImage2ByteArray(alternativeImage, mediaType);
- DiscobitsHandler contentHandler = (DiscobitsHandler)discobitTracker.getService();
- UriRef thumbnailUri = createThumbnailUri((UriRef) node.getNode(), alternativeImage);
- contentHandler.put(thumbnailUri, mediaType, alternativeImageBytes);
- node.addProperty(DISCOBITS.thumbnail, thumbnailUri);
- }
+ generateAlternativeImages(data, mediaType, node);
+ }
+ }
+
+ public UriRef generateAlternativeImage(GraphNode infoBitNode, int width, int height) {
+ try {
+ isAltRepresentation.set(Boolean.TRUE);
+ InfoDiscobit infoBit = InfoDiscobit.createInstance(infoBitNode);
+ BufferedImage buffImage = ImageIO.read(new ByteArrayInputStream(infoBit.getData()));
+ return generateAlternativeImage(buffImage, new Resolution(width, height),
+ MediaType.valueOf(infoBit.getContentType()), infoBitNode);
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ } finally {
+ isAltRepresentation.set(Boolean.FALSE);
+ }
+ }
+
+ private void generateAlternativeImages(byte[] data, MediaType mediaType,
+ GraphNode node) throws RuntimeException {
+ try {
+ isAltRepresentation.set(Boolean.TRUE);
+ BufferedImage buffImage = ImageIO.read(new ByteArrayInputStream(data));
+ int imgWidth = buffImage.getWidth();
+ int imgHeigth = buffImage.getHeight();
+ for (Resolution resolution : resolutions) {
+ if (imgWidth > resolution.getWidth() || imgHeigth > resolution.getHeight()) {
+ generateAlternativeImage( buffImage, resolution, mediaType, node);
}
- } catch (IOException ex) {
- throw new RuntimeException(ex);
- } finally {
- isAltRepresentation.set(Boolean.FALSE);
}
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ } finally {
+ isAltRepresentation.set(Boolean.FALSE);
+ }
+ }
+
+ private UriRef generateAlternativeImage(BufferedImage buffImage, Resolution resolution,
+ MediaType mediaType, GraphNode node) throws IOException {
+ BufferedImage alternativeImage = imageProcessor.makeAThumbnail(buffImage,
+ resolution.getWidth(), resolution.getHeight());
+ byte[] alternativeImageBytes = bufferedImage2ByteArray(alternativeImage, mediaType);
+ DiscobitsHandler contentHandler = (DiscobitsHandler) discobitTracker.getService();
+
+ UriRef thumbnailUri = createThumbnailUri((UriRef) node.getNode(), alternativeImage);
+ contentHandler.put(thumbnailUri, mediaType, alternativeImageBytes);
+ Lock writeLock = node.writeLock();
+ writeLock.lock();
+ try {
+ node.addProperty(DISCOBITS.thumbnail, thumbnailUri);
+ return thumbnailUri;
+ } finally {
+ writeLock.unlock();
}
}
Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.clerezza.platform.content.representations.core/src/main/java/org/apache/clerezza/platform/content/representations/core/ThumbnailService.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.clerezza.platform.content.representations.core/src/main/java/org/apache/clerezza/platform/content/representations/core/ThumbnailService.java?rev=959293&r1=959292&r2=959293&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.clerezza.platform.content.representations.core/src/main/java/org/apache/clerezza/platform/content/representations/core/ThumbnailService.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content.representations/org.apache.clerezza.platform.content.representations.core/src/main/java/org/apache/clerezza/platform/content/representations/core/ThumbnailService.java Wed Jun 30 12:55:12 2010
@@ -25,6 +25,7 @@ import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.concurrent.locks.Lock;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
@@ -72,10 +73,13 @@ public class ThumbnailService implements
ContentGraphProvider cgProvider;
@Reference
PlatformConfig config;
+ @Reference
+ AlternativeRepresentationGenerator altRepGen;
+
private static final Logger log = LoggerFactory.getLogger(ThumbnailService.class);
private BundleContext bundleContext;
private String STATICWEB_PATH = "/org/apache/clerezza/web/resources/style/staticweb/";
- private String BASE_PATH = STATICWEB_PATH + "images/icons/mediatype/";
+ private String MEDIA_TYPE_BASE_PATH = STATICWEB_PATH + "images/icons/mediatype/";
private Bundle cachedStyleBundle = null;
private Map<MediaType, String> mediaTypeIconUriCache =
Collections.synchronizedMap(new HashMap<MediaType, String>());
@@ -97,9 +101,11 @@ public class ThumbnailService implements
* maximum width and height can optionally be specified over the query parameters
* "width" and "height". If more than one acceptable thumbnail is available
* then the thumbnail uri of the thumbnail with the highest resolution
- * (width * height) is returned. If no thumbnail is available then the uri of
- * the icon representing the media type is returned. If also no media type
- * icon is available the uri to default icon is returned.
+ * (width * height) is returned. If no thumbnail is available and the logged
+ * in user has the write permission for the content graph, then an attempt is
+ * made to create the thumbnail on the fly. If this fails or the write permission
+ * is missing, then the uri of the icon representing the media type is returned.
+ * If also no media type icon is available the uri to default icon is returned.
* @param infoBitUri the uri of the infoDiscoBit of which the thumbnail uri should be returned
* @param height the maximum height that the thumbnail has
* @param width the maximum width that the thumbnail has
@@ -107,9 +113,8 @@ public class ThumbnailService implements
*/
@GET
public Response getThumbnailUri(@QueryParam("uri") UriRef infoBitUri,
- @QueryParam("width") Integer width,
- @QueryParam("height") Integer height,
- @Context UriInfo uriInfo) {
+ @QueryParam("width") Integer width, @QueryParam("height") Integer height,
+ @Context UriInfo uriInfo) {
if ((width == null) && (height == null)) {
throw new WebApplicationException(new IllegalArgumentException("height and/or width must be specified"),
Response.Status.BAD_REQUEST);
@@ -125,11 +130,23 @@ public class ThumbnailService implements
if (thumbnailUri != null) {
return Response.seeOther(
URI.create((thumbnailUri).getUnicodeString())).build();
- }
+ }
+
Iterator<Resource> mediaTypes = infoBitNode.getObjects(DISCOBITS.mediaType);
if (mediaTypes.hasNext()) {
MediaType mediaType = MediaType.valueOf(LiteralFactory.getInstance().createObject(
String.class, (TypedLiteral) mediaTypes.next()));
+ // if the infoBit is an image, create a thumbnail on the fly.
+ if (mediaType.getType().startsWith("image")) {
+ try {
+ thumbnailUri = altRepGen.generateAlternativeImage(infoBitNode, width,
+ height);
+ return RedirectUtil.createSeeOtherResponse(thumbnailUri.getUnicodeString(), uriInfo);
+ } catch (Exception ex) {
+ // Was worth a try. eLets go on
+ }
+ }
+
String iconUri = mediaTypeIconUriCache.get(mediaType);
if (iconUri == null) {
iconUri = getMediaTypeIconUri(mediaType);
@@ -146,7 +163,7 @@ public class ThumbnailService implements
if (styleBundle == null) {
throw new RuntimeException("no style bundle found");
}
- String path = BASE_PATH + mediaType.getType() + "/";
+ String path = MEDIA_TYPE_BASE_PATH + mediaType.getType() + "/";
Enumeration entries = styleBundle.findEntries(path,
mediaType.getSubtype() + ".*", false);
String iconUri = createIconUri(entries);
@@ -162,7 +179,7 @@ public class ThumbnailService implements
}
private String getDefaultIconUrl(Bundle bundle) {
- Enumeration entries = bundle.findEntries(BASE_PATH, "any.*", false);
+ Enumeration entries = bundle.findEntries(MEDIA_TYPE_BASE_PATH, "any.*", false);
String iconUri = createIconUri(entries);
if (iconUri != null) {
return iconUri;
@@ -186,16 +203,22 @@ public class ThumbnailService implements
}
UriRef resultThumbnailUri = null;
int pixels = 0;
- Iterator<Resource> thumbnails = infoBitNode.getObjects(DISCOBITS.thumbnail);
- while (thumbnails.hasNext()) {
- UriRef thumbnailUri = (UriRef) thumbnails.next();
- GraphNode thumbnailNode = new GraphNode(thumbnailUri,
- cgProvider.getContentGraph());
- int thumbnailPixels = getSurfaceSizeIfFitting(thumbnailNode, width, height);
- if (thumbnailPixels > pixels) {
- resultThumbnailUri = thumbnailUri;
- pixels = thumbnailPixels;
+ Lock readLock = infoBitNode.readLock();
+ readLock.lock();
+ try {
+ Iterator<Resource> thumbnails = infoBitNode.getObjects(DISCOBITS.thumbnail);
+ while (thumbnails.hasNext()) {
+ UriRef thumbnailUri = (UriRef) thumbnails.next();
+ GraphNode thumbnailNode = new GraphNode(thumbnailUri,
+ cgProvider.getContentGraph());
+ int thumbnailPixels = getSurfaceSizeIfFitting(thumbnailNode, width, height);
+ if (thumbnailPixels > pixels) {
+ resultThumbnailUri = thumbnailUri;
+ pixels = thumbnailPixels;
+ }
}
+ } finally {
+ readLock.unlock();
}
return resultThumbnailUri;
}
@@ -208,7 +231,7 @@ public class ThumbnailService implements
Iterator<Resource> exifWidths = infoBitNode.getObjects(EXIF.width);
Iterator<Resource> exifHeights = infoBitNode.getObjects(EXIF.height);
if (!exifWidths.hasNext() || !exifHeights.hasNext()) {
- log.warn(infoBitNode.getNode() + " doesn't have exif:width and exif:heigh");
+ log.warn(infoBitNode.getNode() + " doesn't have exif:width and exif:height");
return -1;
}
Integer thumbnailWidth = LiteralFactory.getInstance().createObject(
@@ -225,14 +248,20 @@ public class ThumbnailService implements
* returns true if infoBitNode is an image and fits
*/
private boolean isFittingImage(GraphNode infoBitNode, Integer width, Integer height) {
- final Iterator<Literal> mediaTypesIter = infoBitNode.getLiterals(DISCOBITS.mediaType);
- if (!mediaTypesIter.hasNext()) {
- return false;
- }
- if (mediaTypesIter.next().getLexicalForm().startsWith("image")) {
- return getSurfaceSizeIfFitting(infoBitNode, width, height) > -1;
- } else {
- return false;
+ Lock readLock = infoBitNode.readLock();
+ readLock.lock();
+ try {
+ final Iterator<Literal> mediaTypesIter = infoBitNode.getLiterals(DISCOBITS.mediaType);
+ if (!mediaTypesIter.hasNext()) {
+ return false;
+ }
+ if (mediaTypesIter.next().getLexicalForm().startsWith("image")) {
+ return getSurfaceSizeIfFitting(infoBitNode, width, height) > -1;
+ } else {
+ return false;
+ }
+ } finally {
+ readLock.unlock();
}
}
Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/InfoDiscobit.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/InfoDiscobit.java?rev=959293&r1=959292&r2=959293&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/InfoDiscobit.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/InfoDiscobit.java Wed Jun 30 12:55:12 2010
@@ -16,67 +16,67 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.clerezza.platform.content;
-
-import java.util.Iterator;
-import org.apache.clerezza.rdf.core.Literal;
-import org.apache.clerezza.rdf.core.LiteralFactory;
-import org.apache.clerezza.rdf.core.Resource;
-import org.apache.clerezza.rdf.core.TypedLiteral;
-
-import org.apache.clerezza.rdf.utils.GraphNode;
-import org.apache.clerezza.rdf.ontologies.DISCOBITS;
-import org.apache.clerezza.rdf.ontologies.RDF;
-
-/**
- * Represents an InfoDiscoBit
- *
- * @author reto
- */
-class InfoDiscobit {
-
- private GraphNode infoBit;
-
-
- /**
- *
- * @param infoBit
- * @return an instance of InfoDiscobit or null if node is not an InfoDiscoBit
- */
- static InfoDiscobit createInstance(GraphNode node) {
- Iterator<Resource> types = node.getObjects(RDF.type);
- while(types.hasNext()) {
- if (types.next().equals(DISCOBITS.InfoDiscoBit)){
- return new InfoDiscobit(node);
- }
- }
- return null;
- }
-
- private InfoDiscobit(GraphNode infoBit) {
- this.infoBit = infoBit;
- }
-
- public String getContentType() {
- Iterator<Literal> mediaTypeLits = infoBit.getLiterals(DISCOBITS.mediaType);
- if (mediaTypeLits.hasNext()) {
- return mediaTypeLits.next().getLexicalForm();
- }
- return null;
- }
-
- public byte[] getData() {
- byte[] result = null;
- Iterator<Literal> mediaTypeLits = infoBit.getLiterals(DISCOBITS.infoBit);
- if (mediaTypeLits.hasNext()) {
- final Literal literalValue = mediaTypeLits.next();
- if (literalValue instanceof TypedLiteral) {
- result = LiteralFactory.getInstance().createObject(
- (new byte[0]).getClass(),(TypedLiteral)literalValue);
- }
- }
-
- return result;
- };
-
-}
+package org.apache.clerezza.platform.content;
+
+import java.util.Iterator;
+import org.apache.clerezza.rdf.core.Literal;
+import org.apache.clerezza.rdf.core.LiteralFactory;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.TypedLiteral;
+
+import org.apache.clerezza.rdf.utils.GraphNode;
+import org.apache.clerezza.rdf.ontologies.DISCOBITS;
+import org.apache.clerezza.rdf.ontologies.RDF;
+
+/**
+ * Represents an InfoDiscoBit
+ *
+ * @author reto
+ */
+public class InfoDiscobit {
+
+ private GraphNode infoBit;
+
+
+ /**
+ *
+ * @param infoBit
+ * @return an instance of InfoDiscobit or null if node is not an InfoDiscoBit
+ */
+ public static InfoDiscobit createInstance(GraphNode node) {
+ Iterator<Resource> types = node.getObjects(RDF.type);
+ while(types.hasNext()) {
+ if (types.next().equals(DISCOBITS.InfoDiscoBit)){
+ return new InfoDiscobit(node);
+ }
+ }
+ return null;
+ }
+
+ InfoDiscobit(GraphNode infoBit) {
+ this.infoBit = infoBit;
+ }
+
+ public String getContentType() {
+ Iterator<Literal> mediaTypeLits = infoBit.getLiterals(DISCOBITS.mediaType);
+ if (mediaTypeLits.hasNext()) {
+ return mediaTypeLits.next().getLexicalForm();
+ }
+ return null;
+ }
+
+ public byte[] getData() {
+ byte[] result = null;
+ Iterator<Literal> mediaTypeLits = infoBit.getLiterals(DISCOBITS.infoBit);
+ if (mediaTypeLits.hasNext()) {
+ final Literal literalValue = mediaTypeLits.next();
+ if (literalValue instanceof TypedLiteral) {
+ result = LiteralFactory.getInstance().createObject(
+ (new byte[0]).getClass(),(TypedLiteral)literalValue);
+ }
+ }
+
+ return result;
+ };
+
+}