/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.richfaces.photoalbum.social.gplus; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Event; import javax.inject.Inject; import javax.inject.Named; import org.richfaces.json.JSONArray; import org.richfaces.json.JSONException; import org.richfaces.json.JSONObject; import org.richfaces.photoalbum.model.event.ErrorEvent; import org.richfaces.photoalbum.model.event.EventType; import org.richfaces.photoalbum.model.event.Events; @Named @ApplicationScoped public class GooglePlusAlbumCache { @Inject @EventType(Events.ADD_ERROR_EVENT) Event<ErrorEvent> error; private Map<String, JSONObject> albums = new HashMap<String, JSONObject>(); // < albumId, {album} > private Map<String, Map<String, JSONObject>> images = new HashMap<String, Map<String, JSONObject>>(); // < albumId, < imageId, {image} > > private String currentAlbumId; private String currentImageId; public void storeAlbums(List<JSONObject> albumsList) { storeAlbums(albumsList, false); } public void storeAlbums(List<JSONObject> albumsList, boolean rewrite) { String albumId; try { for (JSONObject jo : albumsList) { albumId = jo.getString("fullId"); if (albums.containsKey(albumId) && !rewrite) { // the album has already been loaded return; } else if (rewrite) { albums.remove(albumId); } images.put(albumId, null); albums.put(albumId, jo); } } catch (JSONException je) { error.fire(new ErrorEvent("Error", je.getMessage())); } } public void setAlbumImages(String imagesArray) { String imageId = ""; String albumId = ""; JSONObject jo; try { JSONArray ja = new JSONArray(imagesArray); albumId = ja.getJSONObject(0).getString("fullAlbumId"); currentAlbumId = albumId; if (images.get(albumId) != null) { // these images are already cached return; } int size = ja.length(); // put size in the album albums.get(albumId).put("size", size); images.put(albumId, new HashMap<String, JSONObject>()); for (int i = 0; i < size; i++) { jo = ja.getJSONObject(i); if (!jo.has("albumId") || !jo.has("id")) { error.fire(new ErrorEvent("Error, object does not contain images")); } imageId = jo.getString("id"); images.get(albumId).put(imageId, jo); } albums.get(albumId).put("size", images.get(albumId).size()); } catch (JSONException je) { error.fire(new ErrorEvent("Error", je.getMessage())); } } public JSONObject getAlbum(String albumId) { return albums.get(albumId); } public Map<String, JSONObject> getImagesOfAlbum(String albumId) { return images.get(albumId); } public List<JSONObject> getAlbums(List<String> albumIds) { if (albumIds == null) { return null; } List<JSONObject> list = new ArrayList<JSONObject>(); for (String id : albumIds) { list.add(albums.get(id)); } return list; } public String getCurrentAlbumId() { return currentAlbumId; } public void setCurrentAlbumId(String currentAlbumId) { this.currentAlbumId = currentAlbumId; } public String getCurrentImageId() { return currentImageId; } public void setCurrentImageId(String currentImageId) { this.currentImageId = currentImageId; } public JSONObject getCurrentAlbum() { return albums.get(currentAlbumId); } public List<JSONObject> getCurrentImages() { return new ArrayList<JSONObject>(images.get(currentAlbumId).values()); } public JSONObject getCurrentImage() { return images.get(currentAlbumId).get(currentImageId); } public List<JSONObject> getAllImages() { List<JSONObject> list = new ArrayList<JSONObject>(); for (Map<String, JSONObject> album : images.values()) { if (album != null && album.values() != null && !album.values().isEmpty()) { list.addAll(album.values()); } } return list; } public boolean isAlbumLoaded(String albumId) { return images.containsKey(albumId) && (images.get(albumId) != null); } public void setAlbumAndImages(String aiJson) { try { JSONObject jAlbum = new JSONObject(aiJson); JSONArray albumImages = jAlbum.getJSONArray("images"); jAlbum.remove("images"); String albumId = jAlbum.getString("fullId"); int size = albumImages.length(); jAlbum.put("size", size); albums.put(albumId, jAlbum); images.put(albumId, new HashMap<String, JSONObject>()); JSONObject jo; String imageId; Map<String, JSONObject> album = images.get(albumId); for (int i = 0; i < albumImages.length(); i++) { jo = albumImages.getJSONObject(i); if (!jo.has("id")) { error.fire(new ErrorEvent("Error, object does not contain images")); } imageId = jo.getString("id"); album.put(imageId, jo); } } catch (JSONException je) { error.fire(new ErrorEvent("Error", je.getMessage())); } } }