Package org.itsnat.feashow.features.comp.other

Source Code of org.itsnat.feashow.features.comp.other.FileUploadTreeNode

/*
* This file is not part of the ItsNat framework.
*
* Original source code use and closed source derivatives are authorized
* to third parties with no restriction or fee.
* The original source code is owned by the author.
*
* This program is distributed AS IS 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.
*
* (C) Innowhere Software a service of Jose Maria Arranz Santamaria, Spanish citizen.
*/

package org.itsnat.feashow.features.comp.other;

import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import javax.servlet.ServletResponse;
import org.itsnat.comp.ItsNatComponentManager;
import org.itsnat.comp.button.normal.ItsNatHTMLButton;
import org.itsnat.comp.text.ItsNatHTMLInputFile;
import org.itsnat.core.ItsNatDocument;
import org.itsnat.core.ItsNatServletRequest;
import org.itsnat.core.ItsNatServletResponse;
import org.itsnat.core.event.ItsNatServletRequestListener;
import org.itsnat.feashow.FeatureTreeNode;
import org.w3c.dom.Document;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.html.HTMLButtonElement;
import org.w3c.dom.html.HTMLIFrameElement;
import org.w3c.dom.html.HTMLInputElement;
import org.itsnat.comp.iframe.*;
import org.itsnat.core.ClientDocument;
import org.itsnat.core.ItsNatTimer;
import org.itsnat.core.event.ItsNatEvent;
import org.itsnat.core.event.ItsNatTimerHandle;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

public class FileUploadTreeNode extends FeatureTreeNode implements EventListener
{
    protected ItsNatHTMLInputFile input;
    protected ItsNatHTMLIFrame iframe;
    protected ItsNatHTMLButton button;
    protected Element progressElem;
    protected ItsNatTimerHandle currentTimerHnd;
    protected HTMLIFrameFileUpload currentIframeUpload;

    public FileUploadTreeNode()
    {
    }

    public void startExamplePanel()
    {
        ItsNatDocument itsNatDoc = getItsNatDocument();
        Document doc = itsNatDoc.getDocument();
        ItsNatComponentManager compMgr = itsNatDoc.getItsNatComponentManager();
        this.input = (ItsNatHTMLInputFile)compMgr.createItsNatComponentById("fileUploadInputId");
        this.iframe = (ItsNatHTMLIFrame)compMgr.createItsNatComponentById("fileUploadIFrameId");
        this.button = (ItsNatHTMLButton)compMgr.createItsNatComponentById("fileUploadButtonId");
        button.addEventListener("click", this);
        this.progressElem = doc.getElementById("progressId");
    }

    public void endExamplePanel()
    {
        if (currentTimerHnd != null) currentTimerHnd.cancel();
        this.currentTimerHnd = null;

        if (currentIframeUpload != null) currentIframeUpload.dispose();
        this.currentIframeUpload = null;

        input.dispose();
        this.input = null;

        iframe.dispose();
        this.iframe = null;

        button.removeEventListener("click", this);
        button.dispose();
        this.button = null;

        this.progressElem = null;
    }

    public void updateProgression(long per)
    {
        ItsNatDocument itsNatDoc = getItsNatDocument();
        synchronized(itsNatDoc)
        {
            if (progressElem == null) return;
            Text text = (Text)progressElem.getFirstChild();
            text.setData(String.valueOf(per));
        }
    }

    public void handleEvent(Event evt)
    {
        ClientDocument clientDoc = ((ItsNatEvent)evt).getClientDocument();

        if (currentTimerHnd != null) currentTimerHnd.cancel();
        ItsNatTimer timer = clientDoc.createItsNatTimer();
        EventListener timerListener = new EventListener() {
            public void handleEvent(Event evt) { }   // Nothing to do, this timer just update the client with the current state of progressElem
        };
        this.currentTimerHnd = timer.schedule(null,timerListener,0,1000);
        final ItsNatTimerHandle timerHnd = currentTimerHnd;

        if (currentIframeUpload != null) currentIframeUpload.dispose();
        this.currentIframeUpload = iframe.getHTMLIFrameFileUpload(clientDoc,input.getHTMLInputElement());

        final HTMLIFrameFileUpload iframeUpload = currentIframeUpload;
        ItsNatServletRequestListener listener = new ItsNatServletRequestListener()
        {
            public void processRequest(ItsNatServletRequest request, ItsNatServletResponse response)
            {
                FileUploadRequest fileUpReq = iframeUpload.processFileUploadRequest(request, response);

                try
                {
                    ServletResponse servRes = response.getServletResponse();
                    Writer out = servRes.getWriter();
                    out.write("<html><head /><body>");
                    out.write("<p>Content Type: \"" + fileUpReq.getContentType() + "\"</p>");
                    out.write("<p>Field Name: \"" + fileUpReq.getFieldName() + "\"</p>");
                    out.write("<p>File Name: \"" + fileUpReq.getFileName() + "\"</p>");
                    out.write("<p>File Size: " + fileUpReq.getFileSize() + "</p>");
                    if (fileUpReq.getFileSize() > 4*1024*1024)
                        out.write("<h2>TOO LARGE FILE</h2>");
                    out.write("</body></html>");

                    long fileSize = fileUpReq.getFileSize();
                    if ((fileSize == 0)||(fileSize > 4*1024*1024)) return;

                    byte[] buffer = new byte[10*1024];
                    InputStream fileUp = fileUpReq.getFileUploadInputStream();
                    long count = 0;
                    int read = 0;
                    do
                    {
                        if (iframeUpload.isDisposed())
                            return;

                        try { Thread.sleep(50); }catch(InterruptedException ex){ }
                        count += read;
                        updateProgression((count * 100) / fileSize);
                        read = fileUp.read(buffer);
                    }
                    while (read != -1);
                }
                catch(IOException ex)
                {
                    throw new RuntimeException(ex);
                }
                finally
                {
                    ItsNatDocument itsNatDoc = getItsNatDocument();
                    synchronized(itsNatDoc)
                    {
                        timerHnd.cancel();
                    }
                }
            }
        };
        iframeUpload.addItsNatServletRequestListener(listener);
    }

}
TOP

Related Classes of org.itsnat.feashow.features.comp.other.FileUploadTreeNode

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.