X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fwamblee%2Fphotos%2Fwicket%2FHomePage.java;h=289f783e35340e3358eb48ecb0e5669475007446;hb=c64efa2d2002d15b22f458391cd44dfca44f8c96;hp=a6126b7c2cdaaf79ea47b687d1bc3d5c47fa3a67;hpb=8845e7fe6141ccc98fd070ee4e653941f6e60508;p=photos diff --git a/src/main/java/org/wamblee/photos/wicket/HomePage.java b/src/main/java/org/wamblee/photos/wicket/HomePage.java index a6126b7..289f783 100644 --- a/src/main/java/org/wamblee/photos/wicket/HomePage.java +++ b/src/main/java/org/wamblee/photos/wicket/HomePage.java @@ -15,15 +15,24 @@ */ 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,20 +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 { + + 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(); @@ -65,8 +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()); + } + + 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