package org.vaadin.mideaas.app;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import org.vaadin.mideaas.frontend.Icons;
import org.vaadin.mideaas.model.SharedProject;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Upload;
import com.vaadin.ui.Upload.FailedEvent;
import com.vaadin.ui.Upload.SucceededEvent;
@SuppressWarnings("serial")
public class UploadProjectPanel extends Panel implements Upload.Receiver,
Upload.SucceededListener, Upload.FailedListener {
// http://stackoverflow.com/questions/856013/mime-type-for-zip-file-in-google-chrome
private final static Set<String> ZIP_MIMETYPES = new HashSet<String>(
Arrays.asList(new String[] {
"application/zip",
"application/x-zip",
"application/octet-stream",
"application/x-zip-compressed"
}));
public interface ProjectUploadListener {
public void projectUploaded(SharedProject p);
}
private LinkedList<ProjectUploadListener> listeners = new LinkedList<ProjectUploadListener>();
public void addListener(ProjectUploadListener li) {
listeners.add(li);
}
private Upload upload = new Upload("Upload project zip file", this);
private File file;
private final MideaasUI ui;
public UploadProjectPanel(MideaasUI ui) {
super("Upload Project");
upload.addSucceededListener((Upload.SucceededListener) this);
upload.addFailedListener((Upload.FailedListener) this);
setIcon(Icons.BOX_LABEL);
this.setContent(upload);
this.setWidth("100%");
this.ui =ui;
}
public OutputStream receiveUpload(String filename, String mimeType) {
FileOutputStream fos = null;
try {
file = File.createTempFile(filename, ".zip");
fos = new FileOutputStream(file);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return fos;
}
public void uploadFailed(FailedEvent event) {
Notification.show("Upload failed: " + event.getReason());
}
public void uploadSucceeded(SucceededEvent event) {
// Is this the right way to test if it's a zip file??
if (ZIP_MIMETYPES.contains(event.getMIMEType())) {
ui.uploadProject(file);
} else {
Notification.show("Not a zip file. The mimetype is " +event.getMIMEType());
}
}
// private void createProject(Properties props, File dir) {
// createProject(props.getProperty("PROJECT_NAME"),
// ProjectType.valueOf(props.getProperty("PROJECT_TYPE")), dir);
// }
/* private void createProject(final String name, final ProjectType type, final File dir) {
Project p = Project.createProjectIfNotExist(name, type, false);
if (p==null) {
final Window main = getWindow();
final ConfirmResetDialog dia = new ConfirmResetDialog(name);
dia.overwrite.addListener(new ClickListener() {
public void buttonClick(ClickEvent event) {
main.removeWindow(dia);
Project p = Project.getProject(name);
if (p==null) {
unlucky();
}
else {
p.resetFromDisk(dir);
fireProjectUpload(p);
}
}
});
main.addWindow(dia);
}
else {
p.resetFromDisk(dir);
fireProjectUpload(p);
}
}
private void unlucky() {
getWindow().showNotification("Something strange happened :(", Notification.TYPE_ERROR_MESSAGE);
}
*/
/*
private Properties projectProps(File dir) {
File f = new File(dir, "project.properties");
try {
Properties props = PropertiesUtil.getProperties(f);
if (props.containsKey("PROJECT_TYPE")) {
return props;
}
} catch (IOException e) {
}
return null;
}
*/
// private class ConfirmResetDialog extends Window {
// Button cancel = new Button("Cancel");
// Button overwrite = new Button();
// TODO: Allow renaming project if the name already exists.
// For that, the packages, folders etc. must be renamed too.
//TextField newName = new TextField("Use Another Name:");
//Button rename = new Button("Create New");
/* public ConfirmResetDialog(String name) {
super(name +" already exists");
setModal(true);
setResizable(false);
setWidth("300px");
addComponent(new Label("Project called '"+name+"' already exists."));
addComponent(new Label("What to do?"));
HorizontalLayout ho = new HorizontalLayout();
ho.addComponent(cancel);
ho.addComponent(overwrite);
overwrite.setCaption("Overwrite "+name);
VerticalLayout ho2 = new VerticalLayout();
addComponent(ho);
addComponent(ho2);
cancel.addListener(new ClickListener() {
public void buttonClick(ClickEvent event) {
ConfirmResetDialog.this.close();
}
});
}*/
//}
}