Working upload of photos (individual and zip)
[photos] / src / main / java / org / wamblee / photos / model / authorization / AuthorizedAlbum.java
index 48fb47ace6be662593ceb477ad20e399278120aa..f76fd09a1730005ef7364522f47a002f2e96d653 100644 (file)
@@ -48,8 +48,7 @@ import org.wamblee.security.authorization.WriteOperation;
 @AuthorizedPhotos
 public class AuthorizedAlbum extends AuthorizedPhotoEntry implements Album {
 
-    private static final Logger LOGGER = Logger.getLogger(AuthorizedAlbum.class
-        .getName());
+    private static final Logger LOGGER = Logger.getLogger(AuthorizedAlbum.class.getName());
 
     private AuthorizationService _authorizer;
 
@@ -57,37 +56,29 @@ public class AuthorizedAlbum extends AuthorizedPhotoEntry implements Album {
 
     private HttpSession _session;
 
-    protected AuthorizedAlbum() {
-        super(null);
-        // for CDI
-    }
-
     /**
      * Constructs concurrent album as a decorator for an album implementation.
-     * 
-     * @param aAlbum
-     *            Album to decorate.
+     *
+     * @param aAlbum Album to decorate.
      */
     @Inject
-    public AuthorizedAlbum(@AllPhotos Album aAlbum,
-        AuthorizationService aService,
-        @PhotoCache Cache<String, ArrayList<PhotoEntry>> aCache,
-        HttpSession aSession) {
+    public AuthorizedAlbum(@AllPhotos Album aAlbum, AuthorizationService aService,
+            @PhotoCache Cache<String, ArrayList<PhotoEntry>> aCache, HttpSession aSession) {
         super(aAlbum);
         _authorizer = aService;
-        _authorizedEntries = new CachedObject<String, ArrayList<PhotoEntry>>(
-            aCache, aSession.getId() + "/" + aAlbum.getPath(),
-            new CachedObject.Computation<String, ArrayList<PhotoEntry>>() {
-                public ArrayList<PhotoEntry> getObject(String aObjectKey) {
-                    return AuthorizedAlbum.this.compute();
-                }
-            });
+        _authorizedEntries = new CachedObject<String, ArrayList<PhotoEntry>>(aCache,
+                "session:" + aSession.getId() + "/" + aAlbum.getPath(),
+                new CachedObject.Computation<String, ArrayList<PhotoEntry>>() {
+                    public ArrayList<PhotoEntry> getObject(String aObjectKey) {
+                        return AuthorizedAlbum.this.compute();
+                    }
+                });
         _session = aSession;
     }
 
     /**
      * Computes the cache of photo entries to which read access is allowed.
-     * 
+     *
      * @return Photo entries to which read access is allowed.
      */
     private synchronized ArrayList<PhotoEntry> compute() {
@@ -100,6 +91,9 @@ public class AuthorizedAlbum extends AuthorizedPhotoEntry implements Album {
                 // automatically.
             }
         }
+        if (result == null) {
+            throw new RuntimeException("Result is null");
+        }
         return result;
     }
 
@@ -110,9 +104,8 @@ public class AuthorizedAlbum extends AuthorizedPhotoEntry implements Album {
     /**
      * Creates a decorate for the photo entry to make it safe for concurrent
      * access.
-     * 
-     * @param aEntry
-     *            Entry to decorate
+     *
+     * @param aEntry Entry to decorate
      * @return Decorated photo.
      */
     private <T extends PhotoEntry> T decorate(T aEntry) {
@@ -121,11 +114,9 @@ public class AuthorizedAlbum extends AuthorizedPhotoEntry implements Album {
         } else if (aEntry instanceof Photo) {
             return (T) new AuthorizedPhoto((Photo) aEntry);
         } else if (aEntry instanceof Album) {
-            return (T) new AuthorizedAlbum((Album) aEntry, _authorizer,
-                _authorizedEntries.getCache(), _session);
+            return (T) new AuthorizedAlbum((Album) aEntry, _authorizer, _authorizedEntries.getCache(), _session);
         } else {
-            throw new IllegalArgumentException(
-                "Entry is neither a photo nor an album: " + aEntry);
+            throw new IllegalArgumentException("Entry is neither a photo nor an album: " + aEntry);
         }
     }
 
@@ -157,7 +148,7 @@ public class AuthorizedAlbum extends AuthorizedPhotoEntry implements Album {
                 } else {
                     if (!(entry instanceof Album)) {
                         throw new IllegalArgumentException(getPath() + " " +
-                            aPath);
+                                aPath);
                     }
                     return ((Album) entry).getEntry(remainder);
                 }
@@ -192,8 +183,13 @@ public class AuthorizedAlbum extends AuthorizedPhotoEntry implements Album {
      */
     public void addImage(String aId, InputStream aImage) throws IOException {
         _authorizer.check(this, new WriteOperation());
+        int oldsize = _authorizedEntries.get().size();
         _authorizedEntries.invalidate();
         decorated().addImage(aId, aImage);
+        int newsize = _authorizedEntries.get().size();
+        if (newsize != oldsize + 1) {
+            throw new RuntimeException("cache was not refreshed property");
+        }
     }
 
     /*
@@ -214,16 +210,14 @@ public class AuthorizedAlbum extends AuthorizedPhotoEntry implements Album {
      */
     public void removeEntry(String aId) throws IOException {
         // Check whether deletion is allowed.
-        PhotoEntry entry = _authorizer.check(decorated().getEntry("/" + aId),
-            new DeleteOperation());
+        PhotoEntry entry = _authorizer.check(decorated().getEntry("/" + aId), new DeleteOperation());
         _authorizedEntries.invalidate();
         decorated().removeEntry(aId);
     }
 
     public Photo findPhotoBefore(String aId) {
         Photo entry = decorated().findPhotoBefore(aId);
-        while (entry != null &&
-            !_authorizer.isAllowed(entry, new AllOperation())) {
+        while (entry != null && !_authorizer.isAllowed(entry, new AllOperation())) {
             entry = decorated().findPhotoBefore(entry.getId());
         }
         return decorate(entry);
@@ -231,8 +225,7 @@ public class AuthorizedAlbum extends AuthorizedPhotoEntry implements Album {
 
     public Photo findPhotoAfter(String aId) {
         Photo entry = decorated().findPhotoAfter(aId);
-        while (entry != null &&
-            !_authorizer.isAllowed(entry, new AllOperation())) {
+        while (entry != null && !_authorizer.isAllowed(entry, new AllOperation())) {
             entry = decorated().findPhotoAfter(entry.getId());
         }
         return decorate(entry);