Java 7 is now used.
[photos] / src / main / java / org / wamblee / photos / wicket / HomePage.java
index ccb667034e39cf7bd512dfaada84396f83b280c0..289f783e35340e3358eb48ecb0e5669475007446 100644 (file)
  */
 package org.wamblee.photos.wicket;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
-
 import javax.inject.Inject;
 
 import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.image.Image;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.resource.ByteArrayResource;
 import org.wamblee.photos.model.Album;
+import org.wamblee.photos.model.Photo;
 import org.wamblee.photos.model.PhotoEntry;
 import org.wamblee.photos.model.plumbing.AllPhotos;
+import org.wamblee.photos.model.plumbing.AuthorizedPhotos;
 import org.wamblee.security.authentication.User;
 import org.wamblee.security.authentication.UserAdministration;
 
@@ -35,24 +44,40 @@ public class HomePage extends BasePage {
     private static final long serialVersionUID = 1L;
 
     @Inject
-    private User user;
+    private transient User user;
 
     @Inject
-    private UserAdministration userAdmin;
+    private transient UserAdministration userAdmin;
+
+    // TODO the state should be stored as a path.
 
     @Inject
     @AllPhotos
-    private Album album;
+    private transient Album album;
+
+    @Inject
+    @AuthorizedPhotos
+    private transient Album authorized;
+
+    private class SerializableEntryLink extends Link {
 
-    // @Inject
-    // @AuthorizedPhotos
-    // private Album authorized;
+        private String path;
+
+        public SerializableEntryLink(String aId, String aPath) {
+            super(aId);
+            path = aPath;
+        }
+
+        @Override
+        public void onClick() {
+            System.out.println("Entry " + path + " was clicked");
+        }
+    }
 
     /**
      * Constructor that is invoked when page is invoked without a session.
-     * 
-     * @param parameters
-     *            Page parameters
+     *
+     * @param parameters Page parameters
      */
     public HomePage(final PageParameters parameters) throws Exception {
         super();
@@ -69,17 +94,100 @@ public class HomePage extends BasePage {
         System.out.println("Entries: " + album.size());
         for (int i = 0; i < album.size(); i++) {
             PhotoEntry entry = album.getEntry(i);
-            System.out.println("Entry " + i + " " + entry.getId() + " " +
-                entry.getPath());
+            System.out.println("Entry " + i + " " + entry.getId() + " " + entry.getPath());
         }
 
-        /*
         System.out.println("Authorized Entries: " + authorized.size());
         for (int i = 0; i < authorized.size(); i++) {
             PhotoEntry entry = authorized.getEntry(i);
-            System.out.println("Entry " + i + " " + entry.getId() + " " +
-                entry.getPath());
+            System.out.println("Entry " + i + " " + entry.getId() + " " + entry.getPath());
+        }
+
+        int ientry = 0;
+        int irow = 0;
+        RepeatingView row = new RepeatingView("row");
+        add(row);
+        while (irow < 5 && ientry < authorized.size()) {
+            int icolumn = 0;
+            WebMarkupContainer columns = new WebMarkupContainer(row.newChildId());
+            row.add(columns);
+            RepeatingView column = new RepeatingView("column");
+            columns.add(column);
+            while (icolumn < 5 && ientry < authorized.size()) {
+                WebMarkupContainer thumbnail = new WebMarkupContainer(column.newChildId());
+                column.add(thumbnail);
+
+                final PhotoEntry entry = authorized.getEntry(ientry);
+                Link link = new SerializableEntryLink("thumbnail", entry.getPath());
+                thumbnail.add(link);
+                ImageData data = getData(entry);
+
+                // TODO very inefficient. all data is loaded when generating the page.
+                link.add(new Image("image", new ByteArrayResource(data.getContentType(), data.getData())));
+
+                link.add(new Label("name", authorized.getEntry(ientry).getId()));
+                icolumn++;
+                ientry++;
+            }
+            irow++;
+        }
+    }
+
+    public static final class ImageData {
+        private String contentType;
+        private byte[] data;
+
+        public ImageData(String aContentType, byte[] aData) {
+            contentType = aContentType;
+            data = aData;
+        }
+
+        public String getContentType() {
+            return contentType;
+        }
+
+        public byte[] getData() {
+            return data;
+        }
+    }
+
+    private ImageData getData(PhotoEntry aEntry) {
+        if (aEntry instanceof Photo) {
+            return getData((Photo) aEntry);
+        } else if (aEntry instanceof Album) {
+            return getData((Album) aEntry);
+        } else {
+            throw new RuntimeException("Unsupported type " + aEntry.getClass().getName());
+        }
+    }
+
+    private ImageData getData(Photo aPhoto) {
+        try (InputStream is = aPhoto.getThumbNail()) {
+            return new ImageData("image/jpeg", getBytes(is));
+        }
+        catch (IOException e) {
+            // to improve.
+            throw new RuntimeException("Cannot read photo", e);
+        }
+    }
+
+    private byte[] getBytes(InputStream is) throws IOException {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        byte[] block = new byte[1024];
+        int n = is.read(block);
+        while (n > 0) {
+            bos.write(block, 0, n);
+            n = is.read(block);
+        }
+        return bos.toByteArray();
+    }
+
+    private ImageData getData(Album aAlbum) {
+        try (InputStream is = getClass().getResourceAsStream("folder.png")) {
+            return new ImageData("image/png", getBytes(is));
+        }
+        catch (IOException e) {
+            throw new RuntimeException("Cannot read album jpg", e);
         }
-        */
     }
-}
+}
\ No newline at end of file