aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/itmill/toolkit/ui/Upload.java
diff options
context:
space:
mode:
authorJoonas Lehtinen <joonas.lehtinen@itmill.com>2006-11-01 09:11:32 +0000
committerJoonas Lehtinen <joonas.lehtinen@itmill.com>2006-11-01 09:11:32 +0000
commit13af8cba414fbb6f02ef458a86c5afcad70c5275 (patch)
tree959ccae1696d9c208124ec3982f166bca6c28f0a /src/com/itmill/toolkit/ui/Upload.java
parentde5565e87dc08be0a577c663bb2e009d0838c872 (diff)
downloadvaadin-framework-13af8cba414fbb6f02ef458a86c5afcad70c5275.tar.gz
vaadin-framework-13af8cba414fbb6f02ef458a86c5afcad70c5275.zip
Refactoring: Enably -> IT Mill Toolkit
svn changeset:92/svn branch:toolkit
Diffstat (limited to 'src/com/itmill/toolkit/ui/Upload.java')
-rw-r--r--src/com/itmill/toolkit/ui/Upload.java446
1 files changed, 446 insertions, 0 deletions
diff --git a/src/com/itmill/toolkit/ui/Upload.java b/src/com/itmill/toolkit/ui/Upload.java
new file mode 100644
index 0000000000..3bcb998352
--- /dev/null
+++ b/src/com/itmill/toolkit/ui/Upload.java
@@ -0,0 +1,446 @@
+/* *************************************************************************
+
+ IT Mill Toolkit
+
+ Development of Browser User Intarfaces Made Easy
+
+ Copyright (C) 2000-2006 IT Mill Ltd
+
+ *************************************************************************
+
+ This product is distributed under commercial license that can be found
+ from the product package on license/license.txt. Use of this product might
+ require purchasing a commercial license from IT Mill Ltd. For guidelines
+ on usage, see license/licensing-guidelines.html
+
+ *************************************************************************
+
+ For more information, contact:
+
+ IT Mill Ltd phone: +358 2 4802 7180
+ Ruukinkatu 2-4 fax: +358 2 4802 7181
+ 20540, Turku email: info@itmill.com
+ Finland company www: www.itmill.com
+
+ Primary source for information and releases: www.itmill.com
+
+ ********************************************************************** */
+
+package com.itmill.toolkit.ui;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import com.itmill.toolkit.terminal.PaintException;
+import com.itmill.toolkit.terminal.PaintTarget;
+import com.itmill.toolkit.terminal.UploadStream;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/** Component for client file uploading.
+ *
+ * @author IT Mill Ltd.
+ * @version @VERSION@
+ * @since 3.0
+ */
+public class Upload extends AbstractComponent implements Component.Focusable {
+
+ /** Upload buffer size. */
+ private static final int BUFFER_SIZE = 64 * 1024; // 64k
+
+ /** Should the field be focused on next repaint */
+ private boolean focus = false;
+
+ /** The tab order number of this field */
+ private int tabIndex = 0;
+
+ /** The output of the upload is redirected to this receiver. */
+ private Receiver receiver;
+
+ private long focusableId = -1;
+
+ /* TODO: Add a default constructor, receive to temp file. */
+
+ /** Creates a new instance of Upload that redirects the
+ * uploaded data to given stream.
+ *
+ */
+ public Upload(String caption, Receiver uploadReceiver) {
+ this.focusableId = Window.getNewFocusableId(this);
+ setCaption(caption);
+ receiver = uploadReceiver;
+ }
+
+ /** Get component type.
+ * @return Component type as string.
+ */
+ public String getTag() {
+ return "upload";
+ }
+
+ /** Invoked when the value of a variable has changed. */
+ public void changeVariables(Object source, Map variables) {
+
+ // Check the variable name
+ if (!variables.containsKey("stream"))
+ return;
+
+ // Get the upload stream
+ UploadStream upload = (UploadStream) variables.get("stream");
+
+ // Get file properties
+ String filename = upload.getContentName();
+ String type = upload.getContentType();
+
+ // Get the output target stream
+ OutputStream out = receiver.receiveUpload(filename, type);
+ if (out == null)
+ throw new RuntimeException("Error getting outputstream from upload receiver");
+
+ InputStream in = upload.getStream();
+ if (null==in) {
+ // No file, for instance non-existent filename in html upload
+ fireUploadInterrupted(filename, type, 0);
+ return;
+ }
+ byte buffer[] = new byte[BUFFER_SIZE];
+ int bytesRead = 0;
+ long totalBytes = 0;
+ try {
+ while ((bytesRead = in.read(buffer)) > 0) {
+ out.write(buffer, 0, bytesRead);
+ totalBytes += bytesRead;
+ }
+
+ // Download successfull
+ out.close();
+ fireUploadSuccess(filename, type, totalBytes);
+ requestRepaint();
+
+ } catch (IOException e) {
+
+ // Download interrupted
+ fireUploadInterrupted(filename, type, totalBytes);
+ }
+ }
+
+ /** Paint the content of this component.
+ * @param target Target to paint the content on.
+ * @throws PaintException The paint operation failed.
+ */
+ public void paintContent(PaintTarget target) throws PaintException {
+ // The field should be focused
+ if (focus)
+ target.addAttribute("focus", true);
+
+ // The tab ordering number
+ if (this.tabIndex >= 0)
+ target.addAttribute("tabindex", this.tabIndex);
+
+ target.addUploadStreamVariable(this, "stream");
+ }
+
+ /** Notify all upload listeners */
+ private void notifyListeners() {
+
+ }
+
+ /** Interface that must be implemented by the upload receivers.
+ * @author IT Mill Ltd.
+ * @version @VERSION@
+ * @since 3.0
+ */
+ public interface Receiver {
+
+ /** Invoked when a new upload arrives.
+ * @param filename The desired filename of the upload, usually as specified by the client.
+ * @param MIMEType The MIME type of the uploaded file.
+ * @return Stream to which the uploaded file should be written.
+ */
+ public OutputStream receiveUpload(String filename, String MIMEType);
+ }
+
+ /* Upload events ************************************************ */
+
+ private static final Method UPLOAD_FINISHED_METHOD;
+ private static final Method UPLOAD_FAILED_METHOD;
+ private static final Method UPLOAD_SUCCEEDED_METHOD;
+
+ static {
+ try {
+ UPLOAD_FINISHED_METHOD =
+ FinishedListener.class.getDeclaredMethod(
+ "uploadFinished",
+ new Class[] { FinishedEvent.class });
+ UPLOAD_FAILED_METHOD =
+ FailedListener.class.getDeclaredMethod(
+ "uploadFailed",
+ new Class[] { FailedEvent.class });
+ UPLOAD_SUCCEEDED_METHOD =
+ SucceededListener.class.getDeclaredMethod(
+ "uploadSucceeded",
+ new Class[] { SucceededEvent.class });
+ } catch (java.lang.NoSuchMethodException e) {
+ // This should never happen
+ throw new java.lang.RuntimeException("Internal error");
+ }
+ }
+
+ /** Upload.Received event is sent when the upload receives a file,
+ * regardless if the receival was successfull.
+ * @author IT Mill Ltd.
+ * @version @VERSION@
+ * @since 3.0
+ */
+ public class FinishedEvent extends Component.Event {
+
+ /**
+ * Serial generated by eclipse.
+ */
+ private static final long serialVersionUID = 3257288015385670969L;
+
+ /** Length of the received file. */
+ private long length;
+
+ /** MIME type of the received file. */
+ private String type;
+
+ /** Received file name */
+ private String filename;
+
+ public FinishedEvent(
+ Upload source,
+ String filename,
+ String MIMEType,
+ long length) {
+ super(source);
+ this.type = MIMEType;
+ this.filename = filename;
+ this.length = length;
+ }
+
+ /** Upload where the event occurred
+ * @return Source of the event.
+ */
+ public Upload getUpload() {
+ return (Upload) getSource();
+ }
+ /**
+ * Returns the filename.
+ */
+ public String getFilename() {
+ return filename;
+ }
+
+ /**
+ * Returns the length.
+ */
+ public long getLength() {
+ return length;
+ }
+
+ /**
+ * Returns the type.
+ */
+ public String getMIMEType() {
+ return type;
+ }
+
+ }
+
+ /** Upload.Interrupted event is sent when the upload is received, but the
+ * reception is interrupted for some reason.
+ * @author IT Mill Ltd.
+ * @version @VERSION@
+ * @since 3.0
+ */
+ public class FailedEvent extends FinishedEvent {
+
+ /**
+ * Serial generated by eclipse.
+ */
+ private static final long serialVersionUID = 3833746590157386293L;
+
+ public FailedEvent(
+ Upload source,
+ String filename,
+ String MIMEType,
+ long length) {
+ super(source, filename, MIMEType, length);
+ }
+
+ }
+
+ /** Upload.Success event is sent when the upload is received successfully.
+ * @author IT Mill Ltd.
+ * @version @VERSION@
+ * @since 3.0
+ */
+ public class SucceededEvent extends FinishedEvent {
+
+ /**
+ * Serial generated by eclipse.
+ */
+ private static final long serialVersionUID = 3256445798169524023L;
+
+ public SucceededEvent(
+ Upload source,
+ String filename,
+ String MIMEType,
+ long length) {
+ super(source, filename, MIMEType, length);
+ }
+
+ }
+
+ /** Receives events when the uploads are ready.
+ * @author IT Mill Ltd.
+ * @version @VERSION@
+ * @since 3.0
+ */
+ public interface FinishedListener {
+
+ /** Upload has finished.
+ * @param event Upload finished event.
+ */
+ public void uploadFinished(FinishedEvent event);
+ }
+
+ /** Receives events when the uploads are finished, but unsuccessfull.
+ * @author IT Mill Ltd.
+ * @version @VERSION@
+ * @since 3.0
+ */
+ public interface FailedListener {
+
+ /** Upload has finished unsuccessfully.
+ * @param event Upload failed event.
+ */
+ public void uploadFailed(FailedEvent event);
+ }
+
+ /** Receives events when the uploads are successfully finished.
+ * @author IT Mill Ltd.
+ * @version @VERSION@
+ * @since 3.0
+ */
+ public interface SucceededListener {
+
+ /** Upload successfull..
+ * @param event Upload successfull event.
+ */
+ public void uploadSucceeded(SucceededEvent event);
+ }
+
+ /** Add upload received event listener
+ * @param listener Listener to be added.
+ */
+ public void addListener(FinishedListener listener) {
+ addListener(FinishedEvent.class, listener, UPLOAD_FINISHED_METHOD);
+ }
+
+ /** Remove upload received event listener
+ * @param listener Listener to be removed.
+ */
+ public void removeListener(FinishedListener listener) {
+ removeListener(FinishedEvent.class, listener, UPLOAD_FINISHED_METHOD);
+ }
+
+ /** Add upload interrupted event listener
+ * @param listener Listener to be added.
+ */
+ public void addListener(FailedListener listener) {
+ addListener(FailedEvent.class, listener, UPLOAD_FAILED_METHOD);
+ }
+
+ /** Remove upload interrupted event listener
+ * @param listener Listener to be removed.
+ */
+ public void removeListener(FailedListener listener) {
+ removeListener(FinishedEvent.class, listener, UPLOAD_FAILED_METHOD);
+ }
+
+ /** Add upload success event listener
+ * @param listener Listener to be added.
+ */
+ public void addListener(SucceededListener listener) {
+ addListener(SucceededEvent.class, listener, UPLOAD_SUCCEEDED_METHOD);
+ }
+
+ /** Remove upload success event listener
+ * @param listener Listener to be removed.
+ */
+ public void removeListener(SucceededListener listener) {
+ removeListener(SucceededEvent.class, listener, UPLOAD_SUCCEEDED_METHOD);
+ }
+
+ /** Emit upload received event. */
+ protected void fireUploadReceived(
+ String filename,
+ String MIMEType,
+ long length) {
+ fireEvent(new Upload.FinishedEvent(this, filename, MIMEType, length));
+ }
+
+ /** Emit upload interrupted event. */
+ protected void fireUploadInterrupted(
+ String filename,
+ String MIMEType,
+ long length) {
+ fireEvent(new Upload.FailedEvent(this, filename, MIMEType, length));
+ }
+
+ /** Emit upload success event. */
+ protected void fireUploadSuccess(
+ String filename,
+ String MIMEType,
+ long length) {
+ fireEvent(new Upload.SucceededEvent(this, filename, MIMEType, length));
+ }
+ /** Returns the current receiver.
+ * @return Receiver
+ */
+ public Receiver getReceiver() {
+ return receiver;
+ }
+
+ /** Sets the receiver.
+ * @param receiver The receiver to set
+ */
+ public void setReceiver(Receiver receiver) {
+ this.receiver = receiver;
+ }
+ /**
+ * @see com.itmill.toolkit.ui.Component.Focusable#focus()
+ */
+ public void focus() {
+ Window w = getWindow();
+ if (w != null) {
+ w.setFocusedComponent(this);
+ }
+ }
+
+ /**
+ * @see com.itmill.toolkit.ui.Component.Focusable#getTabIndex()
+ */
+ public int getTabIndex() {
+ return this.tabIndex;
+ }
+
+ /**
+ * @see com.itmill.toolkit.ui.Component.Focusable#setTabIndex(int)
+ */
+ public void setTabIndex(int tabIndex) {
+ this.tabIndex = tabIndex;
+ }
+
+ /**
+ * @see com.itmill.toolkit.ui.Component.Focusable#getFocusableId()
+ */
+ public long getFocusableId() {
+ return this.focusableId;
+ }
+
+}