package org.richfaces.photoalbum.social; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import javax.enterprise.context.SessionScoped; import javax.enterprise.event.Observes; import javax.inject.Inject; import javax.inject.Named; import org.richfaces.json.JSONObject; import org.richfaces.photoalbum.manager.Model; import org.richfaces.photoalbum.model.Event; import org.richfaces.photoalbum.model.Image; import org.richfaces.photoalbum.model.event.EventType; import org.richfaces.photoalbum.model.event.Events; import org.richfaces.photoalbum.model.event.SimpleEvent; import org.richfaces.photoalbum.social.facebook.FacebookAlbumCache; import org.richfaces.photoalbum.social.gplus.GooglePlusAlbumCache; import org.richfaces.photoalbum.util.ImageHandler; @Named @SessionScoped public class EventAlbumsHelper implements Serializable { /** * */ private static final long serialVersionUID = 1L; @Inject Model model; @Inject GooglePlusAlbumCache gpac; @Inject FacebookAlbumCache fac; private String fbAlbumIds; private List<String> emptyFacebookIds = new LinkedList<String>(); private List<String> facebookAlbumIds = new ArrayList<String>(); private List<String> emptyGoogleIds = new LinkedList<String>(); private List<String> googleAlbumIds = new ArrayList<String>(); private List<ImageHandler> images = new ArrayList<ImageHandler>(); private boolean pollEnabled; private boolean facebookNeedsUpdate; private boolean googleNeedsUpdate; /** * Initializes the helper - checks if remote albums are loaded in their caches and prepares list of those that are not * * @param se - event triggered by user selecting an Event to view */ public void init(@Observes @EventType(Events.EVENT_DISPLAYED_EVENT) SimpleEvent se) { images = new ArrayList<ImageHandler>(); setFacebookNeedsUpdate(false); setGoogleNeedsUpdate(false); Event event = model.getSelectedEvent(); // add local images into the list for (Image i : event.getShelf().getImages()) { images.add(new ImageHandler(i)); } /* * Facebook */ setFacebookNeedsUpdate(fac.isLoaded()); /* * Google+ */ emptyGoogleIds = new LinkedList<String>(); googleAlbumIds = new ArrayList<String>(); googleAlbumIds = event.getGooglePlusAlbumIds(); if (googleAlbumIds.size() != 0) { for (String fullId : googleAlbumIds) { if (!gpac.isAlbumLoaded(fullId)) { emptyGoogleIds.add(fullId); } else { for (JSONObject gImage : gpac.getImagesOfAlbum(fullId).values()) { images.add(new ImageHandler(gImage)); } } } } setGoogleNeedsUpdate(emptyGoogleIds.size() > 0); setPollEnabled(emptyGoogleIds.size() > 0); } private void addGoogleImages(String albumId) { for (JSONObject jo : gpac.getImagesOfAlbum(albumId).values()) { images.add(new ImageHandler(jo)); } } public void loadFBImages() { for (String albumId : emptyFacebookIds) { for (JSONObject jo : fac.getImagesFromAlbum(albumId)) { images.add(new ImageHandler(jo)); } } } public boolean isEventEmpty() { return googleAlbumIds.size() == 0; } public boolean isAllLoaded() { return emptyGoogleIds.size() == 0 && !isEventEmpty(); } public String getNextId() { if (emptyGoogleIds.size() == 0) { return "0"; } return emptyGoogleIds.get(0); } public void loadNext() { String currentId = getNextId(); if (!gpac.isAlbumLoaded(currentId)) { return; } addGoogleImages(currentId); emptyGoogleIds.remove(getNextId()); setPollEnabled(emptyGoogleIds.size() != 0); } public boolean isPollEnabled() { return pollEnabled; } public void setPollEnabled(boolean pollEnabled) { this.pollEnabled = pollEnabled; } public List<ImageHandler> getImages() { Collections.sort(images, new Comparator<ImageHandler>() { @Override public int compare(ImageHandler o1, ImageHandler o2) { return o1.getName().compareTo(o2.getName()); } }); return images; } public void setImages(List<ImageHandler> images) { this.images = images; } public boolean isFacebookNeedsUpdate() { return facebookNeedsUpdate; } public void setFacebookNeedsUpdate(boolean facebookNeedsUpdate) { this.facebookNeedsUpdate = facebookNeedsUpdate; } public boolean isGoogleNeedsUpdate() { return googleNeedsUpdate; } public void setGoogleNeedsUpdate(boolean googleNeedsUpdate) { this.googleNeedsUpdate = googleNeedsUpdate; } }