+
+ 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);
+ }