package org.vaadin.easyuploads;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.vaadin.server.PaintException;
import com.vaadin.server.PaintTarget;
import com.vaadin.server.StreamVariable;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.LegacyComponent;
/**
* Server side component for the VMultiUpload widget. Pretty much hacked up
* together to test new Receiver support in the GWT terminal.
*/
@SuppressWarnings("serial")
public class MultiUpload extends AbstractComponent implements LegacyComponent {
List<FileDetail> pendingFiles = new ArrayList<FileDetail>();
private MultiUploadHandler receiver;
StreamVariable streamVariable = new StreamVariable() {
public void streamingStarted(StreamingStartEvent event) {
final FileDetail next = getPendingFileNames().iterator().next();
receiver.streamingStarted(new StreamingStartEvent() {
public String getMimeType() {
return next.getMimeType();
}
public String getFileName() {
return next.getFileName();
}
public long getContentLength() {
return next.getContentLength();
}
public long getBytesReceived() {
return 0;
}
public void disposeStreamVariable() {
}
});
}
public void streamingFinished(final StreamingEndEvent event) {
final FileDetail next = getPendingFileNames().iterator().next();
receiver.streamingFinished(new StreamingEndEvent() {
public String getMimeType() {
return next.getMimeType();
}
public String getFileName() {
return next.getFileName();
}
public long getContentLength() {
return next.getContentLength();
}
public long getBytesReceived() {
return event.getBytesReceived();
}
});
pendingFiles.remove(0);
}
public void streamingFailed(StreamingErrorEvent event) {
receiver.streamingFailed(event);
}
public void onProgress(StreamingProgressEvent event) {
receiver.onProgress(event);
}
public boolean listenProgress() {
return true;
}
public boolean isInterrupted() {
return receiver.isInterrupted();
}
public OutputStream getOutputStream() {
return receiver.getOutputStream();
}
};
private boolean ready;
public void setHandler(MultiUploadHandler receiver) {
this.receiver = receiver;
}
@Override
public void paintContent(PaintTarget target) throws PaintException {
// super.paintContent(target);
target.addVariable(this, "target", streamVariable);
if (ready) {
target.addAttribute("ready", true);
ready = false;
}
target.addAttribute("buttoncaption", getButtonCaption());
}
@Override
public void changeVariables(Object source, Map<String, Object> variables) {
// super.changeVariables(source, variables);
if (variables.containsKey("filequeue")) {
String[] filequeue = (String[]) variables.get("filequeue");
List<FileDetail> newFiles = new ArrayList<FileDetail>(
filequeue.length);
for (String string : filequeue) {
newFiles.add(new FileDetail(string));
}
receiver.filesQueued(newFiles);
pendingFiles.addAll(newFiles);
requestRepaint();
ready = true;
}
}
public Collection<FileDetail> getPendingFileNames() {
return Collections.unmodifiableCollection(pendingFiles);
}
public void setButtonCaption(String buttonCaption) {
this.buttonCaption = buttonCaption;
}
public String getButtonCaption() {
return buttonCaption;
}
public static final class FileDetail implements Serializable {
private String caption;
private String mimeType = "application/octet-stream";
private long contentLength;
public FileDetail(String data) {
String[] split = data.split("---xXx---");
caption = split[1];
contentLength = Long.parseLong(split[0]);
if (split.length >= 3) {
mimeType = split[2];
}
}
public long getContentLength() {
return contentLength;
}
public String getFileName() {
return caption;
}
public String getMimeType() {
return mimeType;
}
}
private String buttonCaption = "...";
}