Package org.itsnat.impl.core.clientdoc

Examples of org.itsnat.impl.core.clientdoc.ClientDocumentAttachedServerImpl


                throw new ItsNatException("Unknown value of itsnat_method parameter (expected \"script\" or \"form\"):" + loadMethod);
        }
        else loadMethodScript = false; // Por defecto es "form" que es mucho m�s r�pido

        ItsNatSessionImpl itsNatSession = getItsNatServletRequest().getItsNatSessionImpl();
        ClientDocumentAttachedServerImpl clientDoc;
        if (loadMethodScript)
        {
            clientDoc = new ClientDocumentAttachedServerScriptImpl(itsNatSession,docTemplate);
        }
        else
        {
            long timeoutLoadMarkup;

            String timeoutStr = getAttrOrParam("itsnat_timeout");
            if (timeoutStr != null)
            {
                timeoutLoadMarkup = Long.parseLong(timeoutStr);
                if (timeoutLoadMarkup < 0) throw new ItsNatException("itsnat_timeout cannot be negative");
            }
            else timeoutLoadMarkup = 10*60*1000; // 10 minutos (en millisec)

            clientDoc = new ClientDocumentAttachedServerFormImpl(itsNatSession,docTemplate,timeoutLoadMarkup);
        }

        bindClientToRequest(clientDoc,false);

        try
        {
            if (loadMethodScript)
                this.response = new ResponseAttachedServerPrepareScriptImpl(this);
            else // Form
                this.response = new ResponseAttachedServerPrepareFormImpl(this);

            response.process();
        }
        catch(RuntimeException ex)
        {
            clientDoc.setInvalid();
            throw ex;
        }
    }
View Full Code Here


    }
   
    @Override
    public void processRequest(ClientDocumentStfulImpl clientDocStateless)
    {
        ClientDocumentAttachedServerImpl clientDoc = itsNatRequest.getItsNatSessionImpl().getClientDocumentAttachedServersById(clientId);
        if (clientDoc == null) throw new ItsNatException("Not found in server"); // MUY raro, las requests son muy seguidas, posiblemente de un cliente malicioso

        try
        {
            bindClientToRequest(clientDoc,false);

            String clientMarkup = getAttrOrParamExist("itsnat_markup_code");
            clientDoc.addClientMarkup(clientMarkup);

            if (clientDoc instanceof ClientDocumentAttachedServerScriptImpl)
                this.response = new ResponseAttachedServerLoadMarkupScriptImpl(this);
            else
                this.response = new ResponseAttachedServerLoadMarkupFormImpl(this);
            response.process();
        }
        catch(RuntimeException ex)
        {
            clientDoc.setInvalid();
            throw ex;
        }
    }
View Full Code Here

        }
    }

    public void addClientDocumentAttachedServer(ClientDocumentAttachedServerImpl clientDoc)
    {
        ClientDocumentAttachedServerImpl res;
        synchronized(attachedServersById)
        {
            res = attachedServersById.put(clientDoc);
        }
        if (res != null) throw new ItsNatException("INTERNAL ERROR"); // Asegura el registro una sola vez
View Full Code Here

        if (res != null) throw new ItsNatException("INTERNAL ERROR"); // Asegura el registro una sola vez
    }

    public boolean removeClientDocumentAttachedServer(ClientDocumentAttachedServerImpl clientDoc)
    {
        ClientDocumentAttachedServerImpl res;
        synchronized(attachedServersById)
        {
            res = attachedServersById.remove(clientDoc);
        }
        return (res != null)// Si true es que fue removido
View Full Code Here

        ClientDocumentAttachedServerImpl[] clientAttachedList = getClientDocumentAttachedServerArray();
        if (clientAttachedList != null)
        {
            for(int i = 0; i < clientAttachedList.length; i++)
            {
                ClientDocumentAttachedServerImpl clientDoc = clientAttachedList[i];

                // Realmente el getLastRequestTime es el getCreationTime pues se supone que si no hay error
                // los requests del proceso de carga son muy seguidos y no merece la pena actualizar, pero por si acaso.
                // Aunque es una barbaridad de tiempo usar el tiempo de inactividad de la sesi�n
                // no tenemos otro tiempo en qu� basarnos y no merece la pena pedir al usuario
                // un nuevo tiempo cuando esto s�lo va a ocurrir en caso de error o de usuario malicioso
                long lastRequestTime = clientDoc.getLastRequestTime()// No hace falta sincronizar
                long interval = currentTime - lastRequestTime;
                if (interval > maxInactiveInterval)
                {
                    clientDoc.setInvalid()// Se desregistra de la sesi�n
                }
            }
        }
    }
View Full Code Here

                // Invalidamos los que llevan m�s tiempo sin usar
                Arrays.sort(clientList,COMPARATOR_ATTACHED_SERVERS);
                for(int i = 0; i < excess; i++)
                {
                    ClientDocumentAttachedServerImpl clientDoc = clientList[i];
                    clientDoc.setInvalid();   // Se desregistra de la sesi�n
                }
            }
        }
    }
View Full Code Here

        // por lo que en ellos quedar� definido el clientDoc en las dos fases del request
        // Modificamos temporalmente el ServletResponse con un wrapper para el que el Writer y el OutputStream
        // recojan la salida como una cadena, pues dicha cadena la tenemos que meter
        // en un document.write en c�digo JavaScript.

        ClientDocumentAttachedServerImpl clientDocAS = getClientDocumentAttachedServer();

        ItsNatStfulDocumentTemplateAttachedServerImpl template = clientDocAS.getItsNatStfulDocumentTemplateAttachedServer();

        ItsNatServletResponseImpl itsNatResponse = getItsNatServletResponse();
        ItsNatServletRequestImpl itsNatRequest = itsNatResponse.getItsNatServletRequestImpl();

        ServletResponse responseOriginal = itsNatResponse.getServletResponse();
        ServletResponseAttachedServer servResWrapper = itsNatResponse.createServletResponseAttachedServer();
        itsNatResponse.setServletResponse(servResWrapper);

        RequestNormalLoadDocAttachedServerImpl delegRequest = new RequestNormalLoadDocAttachedServerImpl(template,getRequestAttachedServerLoadDoc(),itsNatRequest);
        itsNatRequest.setRequest(delegRequest); // Para que al procesar el request el ItsNatServletRequestImpl est� correctamente conectado a request de carga normal no al attached y el c�digo del usuario obtenga el ClientDocument normal por ejemplo
        delegRequest.process(null);
        ClientDocumentStfulImpl clientDocNormal = delegRequest.getClientDocumentStful();
        Browser browser = clientDocNormal.getBrowser();

        itsNatResponse.setServletResponse(responseOriginal); // restauramos

        // Los objetos ItsNatServletRequestImpl y ItsNatServletResponseImpl quedan vinculados
        // a los objetos RequestImpl y ResponseImpl de la carga normal y est� bien as�

        String resultMarkup = servResWrapper.getString(delegRequest.getResponse().getEncoding());

        StringBuilder code = new StringBuilder();
        code.append("itsnat.clean();\n");
        code.append("try{ delete window.itsnat; }catch(ex){}\n"); // Ya ha cumplido su funci�n

        boolean useOnLoad = clientDocAS.isOnLoadHanderUsed();

        // Sabemos que el markup son dos <script> con el c�digo inline
        if (template.isMIME_HTML() && !useOnLoad)
        {
            String resultMarkupStringLiteral = JSRenderImpl.toTransportableStringLiteral(resultMarkup, true, browser);
            code.append( "document.write(" + resultMarkupStringLiteral + ");\n" );
        }
        else // Caso de useOnLoad o no HTML MIME
        {
            // Es un poco absurdo volver al DOM pero es lo mejor
            // document.write no vale.
            ItsNatStfulDocumentImpl itsNatDoc = clientDocNormal.getItsNatStfulDocument();
            DocumentFragment docFrag = itsNatDoc.toDOM(resultMarkup);

            if (template.isMIME_XHTML() || (template.isMIME_HTML() && useOnLoad))
            {
                code.append("var root = document.body;\n");
                code.append("if (!root) root = document.getElementsByTagName(\"body\")[0];\n"); // Caso de MIME XHTML y WebKit
            }
            else // SVG y XUL
            {
                code.append("var root = document.documentElement;\n");
            }

            Element script = (Element)docFrag.getFirstChild();
            while(script != null)
            {
                CharacterData text = (CharacterData)script.getFirstChild();
                String scriptCode = text.getData(); // Si es un nodo Text puede tener el CDATA como parte del texto
                String prefix = "<![CDATA[";
                String suffix = "]]>";
                if (scriptCode.startsWith(prefix))
                    scriptCode = MarkupTemplateVersionImpl.removePrefixSuffix(scriptCode,prefix,suffix);
                String scriptCodeLiteral = JSRenderImpl.toTransportableStringLiteral(scriptCode, true, browser);

                if (template.isMIME_HTML() && useOnLoad)
                {
                    code.append("var script = document.createElement(\"script\");\n");
                    code.append("script.setAttribute(\"id\",\"" + script.getAttribute("id") + "\");\n");
                    if (clientDocAS.getBrowser() instanceof BrowserMSIEOld)
                    {
                        // Esto es porque haciendo script.text = ... da error al insertar (se cae el MSIE)
                        // yo creo que la culpa la tiene la eliminaci�n del <script> desde c�digo
                        // de dentro del <script> insertado via appendChild (no ocurre si es cargado via markup o via document.write())
                        // El evento onload de la p�gina no es ejecutado.
View Full Code Here

        return (ClientDocumentAttachedServerImpl)getClientDocument();
    }

    protected void processResponse()
    {
        ClientDocumentAttachedServerImpl clientDoc = getClientDocumentAttachedServer();
        clientDoc.registerInSession();

        String code = genSendMarkupCode();
        writeResponse(code);
    }
View Full Code Here

    public abstract String genSendMarkupCodeByMethod();

    public String genSendMarkupCode()
    {
        ClientDocumentAttachedServerImpl clientDoc = getClientDocumentAttachedServer();
        Browser browser = clientDoc.getBrowser();

        StringBuilder code = new StringBuilder();
        if ((browser instanceof BrowserMSIEOld)||(browser instanceof BrowserMSIE9)) // IE 9 no tiene XMLSerializer
        {
            // MSIE ve el <!DOCTYPE> como un comentario, en el texto del mismo est�
View Full Code Here

    public String genSendMarkupCodeByMethod()
    {
        StringBuilder code = new StringBuilder();

        ClientDocumentAttachedServerImpl clientDoc = getClientDocumentAttachedServer();
        ItsNatStfulDocumentTemplateAttachedServerImpl template = clientDoc.getItsNatStfulDocumentTemplateAttachedServer();

        ItsNatServletRequestImpl itsNatRequest = getRequest().getItsNatServletRequest();
        String url = itsNatRequest.getServletPath(true, true); // Devuelve un URL absoluto sin la query

        code.append("itsnat.init = function(markupOrig)\n");
        code.append("{ \n");
        code.append("  this.markupCode = escape(markupOrig); \n"); // http://xkr.us/articles/javascript/encode-compare/
        // http://support.microsoft.com/kb/208427 2,083 max len URL, hay que reservar espacio para la parte fija de la URL de ah� el valor de sliceLen
        // aunque otros navegadores soporten mayores URL hay que tener en cuenta que el servidor
        // tambi�n ha de aceptar URLs muy grandes, por lo que el criterio del IE yo creo que es el universal
        // v�lido para todos los casos
        code.append("  this.sliceLen = 1800;\n");
        code.append("  this.pos1 = 0;\n");
        code.append("  this.pos2 = Math.min(this.sliceLen,this.markupCode.length);\n");
        code.append("  this.scriptCount = 0;\n");
        code.append("  this.sendMarkupNext(); \n");
        code.append("}; \n");

        code.append("itsnat.contSendMarkup = function()\n");
        code.append("{ \n");
        code.append("  if (this.pos1 < this.markupCode.length) { this.sendMarkupNext(); return true; }\n");
        code.append("  else { this.endSendMarkup(); return false; } \n");
        code.append("}; \n");

        code.append("itsnat.endSendMarkup = function()\n");
        code.append("{ \n");
        code.append("  var url = \"" + url + "?itsnat_action=" + RequestImpl.ITSNAT_ACTION_ATTACH_SERVER + "&itsnat_subaction=load_doc&itsnat_client_id=" + clientDoc.getId() + "&timestamp=\" + new Date().getTime();\n");
        code.append("  this.writeScript(url);\n");
        code.append("}; \n");

        code.append("itsnat.sendMarkupNext = function()\n");
        code.append("{ \n");
        code.append("  var markupPiece = this.markupCode.substring(this.pos1,this.pos2);\n");
        // Sin embargo no podemos dejar un %NN a medias por ello para asegurarnos de que
        // no hemos cogido parcialmente un %NN vemos si el caracter actual es un % o el anterior
        // en ese caso tomamos una substring un poquito m�s peque�a
        code.append("  var redo = false;\n");
        code.append("  if (this.markupCode.charAt(this.pos2 - 1) == '%') { this.pos2 -= 1; redo = true; }\n");
        code.append("  if (this.markupCode.charAt(this.pos2 - 2) == '%') { this.pos2 -= 2; redo = true; }\n");
        code.append("  if (redo) markupPiece = this.markupCode.substring(this.pos1,this.pos2);\n");

        code.append("  if (typeof this.scriptGlobalCount == \"undefined\") this.scriptGlobalCount = 0;\n");
        code.append("  this.scriptGlobalCount++; "); // Para asegurar totalmente la unicidad en caso de env�os demasiado r�pidos

        code.append("  var url = \"" + url + "?itsnat_action=" + RequestImpl.ITSNAT_ACTION_ATTACH_SERVER + "&itsnat_subaction=load_markup&itsnat_client_id=" + clientDoc.getId() + "&timestamp=\" + new Date().getTime() + \"-\" + this.scriptGlobalCount + \"&itsnat_markup_code=\" + markupPiece;\n");
        code.append("  this.writeScript(url);\n");
        code.append("  this.pos1 = this.pos2; this.pos2 += this.sliceLen;\n");
        code.append("  if (this.pos2 > this.markupCode.length) this.pos2 = this.markupCode.length;\n");
        code.append("}; \n");
View Full Code Here

TOP

Related Classes of org.itsnat.impl.core.clientdoc.ClientDocumentAttachedServerImpl

Copyright © 2018 www.massapicom. 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.