Author: reto
Date: Wed Feb 24 22:43:47 2010
New Revision: 916019

URL: http://svn.apache.org/viewvc?rev=916019&view=rev
Log:
CLEREZZA-126: closed

Removed:
    incubator/clerezza/issues/CLEREZZA-126/
Modified:
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.webapp.parent/org.apache.clerezza.platform.content.representations/
   (props changed)
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.webapp.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

Propchange: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.webapp.parent/org.apache.clerezza.platform.content.representations/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Feb 24 22:43:47 2010
@@ -1 +1,2 @@
+/incubator/clerezza/issues/CLEREZZA-126/org.apache.clerezza.platform.content.representations:910212-916002
 
/incubator/clerezza/issues/CLEREZZA-38/org.apache.clerezza.platform.content.representations:893127-895998

Modified: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.webapp.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.webapp.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=916019&r1=916018&r2=916019&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.webapp.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.webapp.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 Feb 24 22:43:47 2010
@@ -6,9 +6,9 @@
  * to you 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
@@ -19,23 +19,28 @@
 package org.apache.clerezza.platform.content.representations.core;
 
 import java.net.URI;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.apache.clerezza.jaxrs.utils.RedirectUtil;
 import org.apache.clerezza.platform.config.PlatformConfig;
-import 
org.apache.clerezza.platform.content.representations.ontologies.REPRESENTATIONS;
 import org.apache.clerezza.platform.graphprovider.content.ContentGraphProvider;
 import org.apache.clerezza.rdf.core.Literal;
 import org.apache.clerezza.rdf.core.LiteralFactory;
-import org.apache.clerezza.rdf.core.NonLiteral;
 import org.apache.clerezza.rdf.core.Resource;
 import org.apache.clerezza.rdf.core.TypedLiteral;
 import org.apache.clerezza.rdf.core.UriRef;
-import org.apache.clerezza.rdf.core.impl.TripleImpl;
 import org.apache.clerezza.rdf.ontologies.DISCOBITS;
 import org.apache.clerezza.rdf.ontologies.EXIF;
 import org.apache.clerezza.rdf.utils.GraphNode;
@@ -43,6 +48,10 @@
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,47 +59,36 @@
 /**
  * This JAX-RS resource provides a method to retrieve the uri to
  * the thumbnail or a other small representation of a InfoDiscoBit.
- * 
+ *
  * @author mir
  */
 @Component
-...@service(value = Object.class)
+...@service(Object.class)
 @Property(name = "javax.ws.rs", boolValue = true)
 @Path("thumbnail-service")
-public class ThumbnailService {
+public class ThumbnailService implements BundleListener{
 
        @Reference
        ContentGraphProvider cgProvider;
        @Reference
        PlatformConfig config;
-       private UriRef defaultIconUri;
        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 Bundle cachedStyleBundle = null;
+       private Map<MediaType, String> mediaTypeIconUriCache =
+                       Collections.synchronizedMap(new HashMap<MediaType, 
String>());
 
        protected void activate(ComponentContext context) {
-               String baseUri = config.getDefaultBaseUri().getUnicodeString();
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/text/plain.png"), MediaType.TEXT_PLAIN);
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/application/msword.png"), "application/msword");
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/application/x-amf.png"), 
"application/x-shockwave-flash");
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/application/pdf.png"), "application/pdf");
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/application/vnd.ms-powerpoint.png"), 
"application/vnd.ms-powerpoint");
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/application/x-tar.png"), "application/x-tar");
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/application/x-amf.png"), "application/x-amf");
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/application/vnd.ms-excel.png"), 
"application/vnd.ms-excel");
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/application/octet-stream.png"), 
"application/octet-stream");
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/audio/any.png"), "audio/x-wav");
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/audio/any.png"), "audio/mpeg");
-               addMediaTypeIcon(createUriRef(baseUri, 
"style/images/icons/mediatype/audio/any.png"), "audio/mid");
-               defaultIconUri = createUriRef(baseUri, 
"style/images/icons/mediatype/any.png");
-       }
-
-       private UriRef createUriRef(String baseUri, String relativeUri) {
-               return new UriRef(baseUri + relativeUri);
-       }
-
-       private void addMediaTypeIcon(UriRef icon, String type) {
-               cgProvider.getContentGraph().add(
-                               new TripleImpl(icon, REPRESENTATIONS.isIconFor,
-                               
LiteralFactory.getInstance().createTypedLiteral(type)));
+               bundleContext = context.getBundleContext();
+               bundleContext.addBundleListener(this);
+       }
+
+       protected void deactivate(ComponentContext context) {
+               bundleContext.removeBundleListener(this);
+               bundleContext = null;
+               mediaTypeIconUriCache.clear();
        }
 
        /**
@@ -110,7 +108,8 @@
        @GET
        public Response getThumbnailUri(@QueryParam("uri") UriRef infoBitUri,
                        @QueryParam("width") Integer width,
-                       @QueryParam("height") Integer height) {
+                       @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);
@@ -129,16 +128,55 @@
                }
                Iterator<Resource> mediaTypes = 
infoBitNode.getObjects(DISCOBITS.mediaType);
                if (mediaTypes.hasNext()) {
-                       GraphNode mediaType = new GraphNode(mediaTypes.next(),
-                                       cgProvider.getContentGraph());
-
-                       Iterator<NonLiteral> icons = 
mediaType.getSubjects(REPRESENTATIONS.isIconFor);
-                       if (icons.hasNext()) {
-                               return Response.seeOther(
-                                               URI.create(((UriRef) 
icons.next()).getUnicodeString())).build();
+                       MediaType mediaType = 
MediaType.valueOf(LiteralFactory.getInstance().createObject(
+                                       String.class, (TypedLiteral) 
mediaTypes.next()));
+                       String iconUri = mediaTypeIconUriCache.get(mediaType);
+                       if (iconUri == null) {
+                               iconUri = getMediaTypeIconUri(mediaType);
+                               mediaTypeIconUriCache.put(mediaType, iconUri);
                        }
+                       return RedirectUtil.createSeeOtherResponse(iconUri, 
uriInfo);
+               }
+               return RedirectUtil.createSeeOtherResponse(
+                               getDefaultIconUrl(getStyleBundle()), uriInfo);
+       }
+
+       private String getMediaTypeIconUri(MediaType mediaType) {
+               Bundle styleBundle = getStyleBundle();
+               if (styleBundle == null) {
+                       throw new RuntimeException("no style bundle found");
+               }
+               String path = BASE_PATH + mediaType.getType() + "/";
+               Enumeration entries = styleBundle.findEntries(path,
+                               mediaType.getSubtype() + ".*", false);
+               String iconUri = createIconUri(entries);
+               if (iconUri != null) {
+                       return iconUri;
+               }
+               entries = styleBundle.findEntries(path, "any.*", false);
+               iconUri = createIconUri(entries);
+               if (iconUri != null) {
+                       return iconUri;
+               }
+               return getDefaultIconUrl(styleBundle);
+       }
+
+       private String getDefaultIconUrl(Bundle bundle) {
+               Enumeration entries = bundle.findEntries(BASE_PATH, "any.*", 
false);
+               String iconUri = createIconUri(entries);
+               if (iconUri != null) {
+                       return iconUri;
+               } else {
+                       throw new RuntimeException("No default icon found");
                }
-               return 
Response.seeOther(URI.create(defaultIconUri.getUnicodeString())).build();
+       }
+
+       private String createIconUri(Enumeration entries) {
+               if (entries != null && entries.hasMoreElements()) {
+                       URL iconUrl = (URL) entries.nextElement();
+                       return iconUrl.getPath().replace(STATICWEB_PATH, 
"style/");
+               }
+               return null;
        }
 
        private UriRef getThumbnailUri(GraphNode infoBitNode,
@@ -197,4 +235,29 @@
                        return false;
                }
        }
+
+       private synchronized Bundle getStyleBundle() {
+               if (cachedStyleBundle != null) {
+                       return cachedStyleBundle;
+               }
+               Bundle[] bundles = bundleContext.getBundles();
+               for (Bundle bundle : bundles) {
+                       URL staticWebPathURL = bundle.getEntry(STATICWEB_PATH);
+                       if (staticWebPathURL != null ) {
+                               cachedStyleBundle = bundle;
+                               return bundle;
+                       }
+               }
+               return null;
+       }
+
+       @Override
+       public synchronized void bundleChanged(BundleEvent be) {
+               if (be.getType() == BundleEvent.UNINSTALLED && 
+                               be.getBundle().equals(cachedStyleBundle)) {
+                       cachedStyleBundle = null;
+                       cachedStyleBundle = getStyleBundle();
+                       mediaTypeIconUriCache.clear();
+               }
+       }
 }


Reply via email to