/*
* 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.manager;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.MalformedInputException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.richfaces.json.JSONException;
import org.richfaces.json.JSONObject;
import org.richfaces.photoalbum.model.Album;
import org.richfaces.photoalbum.model.Event;
import org.richfaces.photoalbum.model.actions.IAlbumAction;
import org.richfaces.photoalbum.model.actions.IEventAction;
import org.richfaces.photoalbum.model.event.ErrorEvent;
import org.richfaces.photoalbum.model.event.EventType;
import org.richfaces.photoalbum.model.event.Events;
import org.richfaces.photoalbum.model.event.ShelfEvent;
import org.richfaces.photoalbum.util.Constants;
import org.richfaces.photoalbum.util.FileHandler;
import org.richfaces.photoalbum.util.PhotoAlbumException;
/**
* This class takes care of downloading a list of images from given URLs and putting them into a new album
*
* @author mpetrov
*
*/
@Named
@SessionScoped
public class FileDownloadManager implements Serializable {
/**
*
*/
private static final long serialVersionUID = 3815919720565571122L;
@Inject
FileUploadManager fileUploadManager;
@Inject
AlbumManager albumManager;
@Inject
IAlbumAction albumAction;
@Inject
IEventAction eventAction;
@Inject
EventManager eventManager;
@Inject
Model model;
@Inject
@EventType(Events.EVENT_EDITED_EVENT)
javax.enterprise.event.Event<ShelfEvent> shelfEvent;
@Inject
@EventType(Events.ADD_ERROR_EVENT)
javax.enterprise.event.Event<ErrorEvent> error;
private List<String> imageUrls;
private Iterator<String> iterator;
private String pBarText;
private int pBarValue = -1;
private int size;
private int count;
private Album album;
private String albumId;
private void setImages(Map<String, JSONObject> images) throws JSONException {
imageUrls = new ArrayList<String>();
for (JSONObject jo : images.values()) {
if (jo.has("src_big")) {
imageUrls.add(jo.getString("src_big"));
} else if (jo.has("src")) {
imageUrls.add(jo.getString("src"));
} else if (jo.has("url")) {
imageUrls.add(jo.getString("url"));
}
}
}
private void createAlbum(String name, Event event) {
album = new Album();
album.setName(name);
album.setShelf(event.getShelf());
albumManager.addAlbum(album);
}
public void setUpDownload(String albumName, String albumId, Map<String, JSONObject> images, Event event) {
try {
setImages(images);
} catch (JSONException je) {
error.fire(new ErrorEvent("Error", "error saving album<br/>" + je.getMessage()));
}
size = imageUrls.size();
count = 0;
iterator = imageUrls.iterator();
pBarText = "0 / " + size;
pBarValue = 0;
this.albumId = albumId;
createAlbum(albumName, event);
album = albumAction.resetAlbum(album);
}
public void downloadNext() {
if (!hasNext()) {
return;
}
String imageUrl = iterator.next();
uploadImage(imageUrl, album.getName() + imageUrl.substring(imageUrl.lastIndexOf(Constants.DOT)), album);
count++;
pBarValue = (count * 100) / size;
pBarText = count + " / " + size;
}
public void finishDownload() {
Event event = album.getShelf().getEvent();
// save the album
try {
albumAction.editAlbum(album);
album = albumAction.resetAlbum(album);
} catch (PhotoAlbumException pae) {
error.fire(new ErrorEvent("Error", "error saving album<br/>" + pae.getMessage()));
}
// remove the remote album from the event
if (event.getRemoteAlbumIds().contains("F" + albumId)) {
event.getRemoteAlbumIds().remove("F" + albumId);
} else if (event.getRemoteAlbumIds().contains("G" + albumId)) {
event.getRemoteAlbumIds().remove("G" + albumId);
}
try {
eventAction.editEvent(event);
} catch (PhotoAlbumException pae) {
error.fire(new ErrorEvent("Error", "error removing album<br/>" + pae.getMessage()));
}
pBarText = "";
pBarValue = -1;
UIComponent root = FacesContext.getCurrentInstance().getViewRoot();
UIComponent component = root.findComponent("overForm");
FacesContext.getCurrentInstance().addMessage(component.getClientId(FacesContext.getCurrentInstance()),
new FacesMessage(FacesMessage.SEVERITY_INFO, "Success!", "Album has been successfully imported"));
// reset the view
shelfEvent.fire(new ShelfEvent(event));
}
private void uploadImage(String imageUrl, String imageName, Album album) {
File file = new File(imageName);
int i;
try {
URL url = new URL(imageUrl);
URLConnection con = url.openConnection();
BufferedInputStream bis = new BufferedInputStream(con.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getName()));
while ((i = bis.read()) != -1) {
bos.write(i);
}
bos.flush();
bis.close();
} catch (MalformedInputException malformedInputException) {
error.fire(new ErrorEvent("Error", "error uploading image<br/>" + malformedInputException.getMessage()));
} catch (IOException ioException) {
error.fire(new ErrorEvent("Error", "IO error<br/>" + ioException.getMessage()));
}
fileUploadManager.uploadFile(new FileHandler(file), album);
}
public int getValue() {
return pBarValue;
}
public String getText() {
return pBarText;
}
public Iterator<String> getIterator() {
return iterator;
}
public boolean hasNext() {
return iterator != null && iterator.hasNext();
}
}