US00759.6791 B2

(12) United States Patent (10) Patent No.: US 7,596,791 B2 Wei et al. (45) Date of Patent: Sep. 29, 2009

(54) METHODS AND TECHNIQUES FOR (56) References Cited DELIVERING RICHUAVAAPPLICATIONS U.S. PATENT DOCUMENTS OVER THIN-WIRE CONNECTIONS WITH 6,064,382 A * 5/2000 Diedrich et al...... 71.5/7OO HIGH PERFORMANCE AND SCALABILITY 6,446,109 B2 * 9/2002 Gupta ...... TO9,203 6,615,131 B1* 9/2003 Rennard et al...... 701 (200 (75) Inventors: Coach K. Wei, Boston, MA (US); Zakir 6,901,554 B1* 5/2005 Bahrs et al...... 715,526 Magdum, Shrewsburry, MA (US) 6,968,503 B1 * 1 1/2005 Chang et al...... 71.5/2O2 7,404,177 B1 * 7/2008 Greenfield et al...... 717/106 (73) Assignee: EMC Corporation, Hopkinton, MA OTHER PUBLICATIONS (US) Ken Nordby, “What are Enterprise JavaBeans components? Part 1: The history and goals of EJB architecture.” Jun. 22, 2000, pp. 1-8.* (*) Notice: Subject to any disclaimer, the term of this patent is extended or adjusted under 35 * cited by examiner U.S.. 154(b) by 911 days. Primary Examiner Li B Zhen (74) Attorney, Agent, or Firm Krishnendu Gupta; Joseph (21) Appl. No.: 10/017,183 'Angelo (22) Filed: Dec. 7, 2001 (57) ABSTRACT A method for delivering applications over a network where (65) Prior Publication Data the application's logic runs on the backend server and the US 2003/O2OO254A1 Oct. 23, 2003 applications is rendered on a client-device, according to its display capabilities, thought a network con Related U.S. Application Data nection with the backend server. The application's GUI API and event processing API are implemented to be network (60) Provisional application No. 60/256,594, filed on Dec. aware, transmitting application's presentation layer informa 19, 2000. tion, event processing registries, and other related informa tion a between client and server. The transmission is a high, (51) Int. Cl. object level format, which minimizes network traffic. Client G06F 9/44 (2006.01) side events are transmitted to the server for processing via a G06F 9/54 (2006.01) predetermined protocol, the server treating Such events and (52) U.S. Cl...... 71.9/316; 709/203; 709/219; inputs as if locally generated. The appropriate response to the 71.5/234 input is generated and transmitted to the client device using (58) Field of Classification Search ...... 709/203, the format to refresh the GUI on the client. 709/219; 715/513, 234; 719/316 See application file for complete search history. 20 Claims, 20 Drawing Sheets

1 OO 110 Y Y 12O Y

ireless

114 : 122

1 O2 104 Platforms E Active - X Windows Netscape Plugin, Windows CE \App Player { (

127 U.S. Patent Sep. 29, 2009 Sheet 1 of 20 US 7,596,791 B2

00|| U.S. Patent Sep. 29, 2009 Sheet 2 of 20 US 7,596,791 B2

ZZ!

55]

98||

O - - Cld C. -- U.S. Patent Sep. 29, 2009 Sheet 3 of 20 US 7,596,791 B2

98||

08||

U.S. Patent Sep. 29, 2009 Sheet 5 of 20 US 7,596,791 B2

008

U.S. Patent Sep. 29, 2009 Sheet 6 of 20 US 7,596,791 B2

4OO Y Interface .awt. Layoutlvanage iava.awt. LaVOutManader2 java.awt. Grid Layout java.awt. FlowLayout java.awt. GridBag Layout java.aWt.BOXLayout java.awt. CardLayout javaX..ViewportLayout javaX.SWing. ScrollPanelayout jaVax.SWing. OverlayLayout

FIG. 6 U.S. Patent US 7,596,791 B2

(5G)(warjeviheewienuaeaer

U.S. Patent Sep. 29, 2009 Sheet 8 of 20 US 7,596,791 B2

5OO

504 Validati U Components C alidation 502 omponents U. 506 508 m--- Components wm-r Events Display Manader Manager 9

Ul Server Interface 510

U Cache Manager 512

Security Manager 514 Communication Layer(HTTP/HTTPS/Sockets) 516.

FIG. 8 U.S. Patent Sep. 29, 2009 Sheet 9 of 20 US 7,596,791 B2

600 Y

Container Controls Controls

FIG. 9 U.S. Patent Sep. 29, 2009 Sheet 10 of 20 US 7,596,791 B2

2OO 220 Y Y Package ComnexaWeb.core(Nexel Core Classes) layout Managers - Interface.javaawtlayOutManager Javax servlet.httpservlet. HttpServlet avaawt.Layouthanaqer2

COm.nexaWeb.Core. Nexel java.awtGridLayOut - COm.nexaWeb.COreAppManager java.awt.patro FlowLayOut H java.awtGridBaglayOut ComnexaWeb.core. Application remo --- jaVaawt.BOXLayOut

com.nexaweb.core. EventManager H javaawtCardLayoutacada | com.nexaweb.core.JVMManager jaVax. Swing ViewportLayout com.nexaWeb.core. ConnectionManager - javaXSwingScrollPanelayOut com.nexaWeb.core...PerformanceManager javaXSwing OverlayLayout

240 Y 26O Package Com.nexaWeb.net Additional Classes

com.nexaweb.net.NetEngine java.awt. Graphics COm.nexaWeb.net. NexelServerSOcket javaawt. Graphics2D COm.nexaWeb.net. SOcketHandler javaawtprint PrinterJob com.nexaWeb.net ClientNetEngine java.awt Toolkit COmnexaWeb.coreServerNetEngine COmnexaWeb.Validation com.nexaWeb.net.NexelServletRequest COmnexaWeb.net. NexelServletResponse Additional Drag&Drop support classes FIG 10 U.S. Patent Sep. 29, 2009 Sheet 11 of 20 US 7,596,791 B2

CEBasicArrowbutton

Package Com.nexaWeb.plafice CEButton 28O CEMentaComboBoxButton

CECheckBoxMenultem H CEMenultemV. CEjMenu

com.nexaWeb.plaf CEComponently - CEAbSractutton CERadioButtonMe?ultem CEToggleButtonul

com.nexawebplaf.CEContaineru H CEColorChooseru CECheckBoxU - CEComboBoxU CERadioButton

| - CEFile:ChooserU CEBasicComboBoxRenderer

--- CEinemaframe -- CEDefaultistCeRendereru

com.nexaWeb.plaf.CEBOxUl - CEDesktoplconV - CEDefaultlableCellRenderer --- CELabellji CEDefault TreeCeLRendererJ

h CELayeredPanell -- CEJDesktopPanely - CEComponentu H------CEListU

--- CEMenubaru - CEOptionPareul

- CEPanelVI (for awt. Panel) H CEPanelVI (JPanel) - CEAbstractColorCh00serPanel - CEPopupMenull CEBasicComboPopupy

CEAppletUI (for JApplet) - CEProgressBarul CFAbstractBorderU CER00Panel

CEWindow.JI (for - CEScrollBar -- CEBevelEOrderU CESoftBevelborderU awtWindow) CESCOPanell - CECompoundBorderUl CEWindowu (for CESeparatorul --- CEEmptyBorderUI JWindow) - CESliderUl - CEElechedEOrderU - CESplitPaneul CELineBorderU CEDialogul (for - CETabbedpanel - CEatteBorderU awt.Dialog) - - CFTable - CETitledBorderU CEDialog(for JDialog) CETableHeaderU -- H CETextComponentUl CEEditorpanej |- CETextPanel CFToolBar

- CEFrameU CFTextArea - CEToolTipUI ------CEDefaultextFieldV CETextField -----, ... -- CETreeV - CEPasswordField CEFrameU (for JFrame) CEViewportU

FIG 11 U.S. Patent Sep. 29, 2009 Sheet 12 of 20 US 7,596,791 B2

Package Com.nexaWeb.plaf.pC 290 - PCButtonu -- PCBasicATOWButton Y - - - PCMentalComboBoxButton

PCCheckBoxMenultern - PCMenultenU H PCJMenulu com.nexaweb, plaf PCComponently PCAbstractButton PCRadioButtonMenultemV PCToggleButtonulT - com.nexaweb.plaf.PCContaineru PCColorChooserU PCCheckBoxU PCComboBoxul - PCRadioButton - PCFileChooserU -PCBasicComboBoxRendererJ k H- PCInternaframeUI PCDefaultListCellRenderer

com.nexaWeb.plaf.PCBoxUl PCDesktoplconut PCDefaultTableCellRendererJ - - - - PCLabel PCDefaulTreeCe RendererJI PCLayeredPanell - PCJDesktopPaneu)

- PCComponentul ------PCistU

- PCMenubaru PCOption Paneu PCPanelul (for awt. Panel) PCPanelVI (JPanel) PCAbsractColorChooserPanel J

-- - - PCPopupMenului PCBasicCombopopulptul PCAppletUl(for JApplet) PCProgressBarty PCR00tPanel J

- PCWindowul (for -- PCScrollBarul -- PCBeweBorder PCSoftBevelEOrderU awt Window) PCScrollPanel J - PCCompoundBorderUl - PCWindowul (for --- PCSeparatorul - PCEmptyborderUI - - - JWindow) - PCSliderU - PCEtechedEOrderU PCSplitPaneui PCineBorderU - PCDialogul (for PCTabbedpanely - PCatteorderUl awt.Dialog) titled PCTableU PCitedBorderU PCDialog for JDialog) -- PCTableHeaderUI PCTextComponentul r PCEditorpanel PCTextPane PCToolBaru - PCFrameUI PCTextArea.J. --- PCToolTipUl PCDefaultTextField

- - - PCTextField PCTreeJ PCPasswordField H PCFrameUI (for JFrame) PCViewportU.

FIG. 12 U.S. Patent Sep. 29, 2009 Sheet 13 of 20 US 7,596,791 B2

710

Class connexawebserverconnectionManager,

package com.nexaweb, server, importava.lang. import.java.lang.reflect. importava.uti. importava.k.a. importava,text. importava...awtevent.": importava...awt'; importavax, servlet, importavax.seryet http." public static Object getConnection() { Thread thathread.currentThread(); public class HttpManager Sting names null; protected static Hashtable threadListenew Hashtable(); ifthsh. instanceof AppServiceThread)icehead { in this case, the connection is stored into HttpManager in a parent thread public HttpManager) retum) ', and the retrieving happens in a child thread AppServiceThread ath=(AppServiceThread)th, public synchronized static void putString trame, ServietResponse httpResponse) name rathgetParentThreadlame(); { System.out.printin(this is an AppServiceThread: parentlame="+name); threadList puttname,httpResponse), } else names-thgetiname(); System.out.printin("Tring to get connection by thread names' name); public syndhronized static void remove(String tiname) ObjectoorgetConnection(name); IObject po-roo; System.out.printin("Removing entry for "ttname): forcinitieotrue:) (break threadlist.removetname): f(poss-null) break System.out.printin("Class is: "+pogetClass) getName()+"wn); pospo.getClass-getSuperclass(); public synchronized static void remove() } (Threadth=Thread,curren(Thread(), Sting name thigetName(); threadistremove(name): ty System.out.printin("HttpManagerget connection: shootoo.dasss-toogetClassO.getName()); private static Object getConnection(String tiname) { catch(Exceptionee) System.out.printin("Exception in HTTPManager"tee)} systern cutprintin("Get connection:threadList'-threadust", name=tname); return oo Object orthread Ust.get(tnarie): system.out.printin("Get connection:thread uste' threadList",connection"o). feturno:

FIG. 13 U.S. Patent Sep. 29, 2009 Sheet 14 of 20 US 7,596,791 B2

720

Class commexaWeb server. Nexel

import java.io.; importava text: import.java.util." importavax.seryet." importavax.servlet.http. importcom.nexaweb, server.' far System.out.println("Requests"+request.toString()); religitation sever eventid="+eid+"appid."+appid+"ctiid="tdd);System.out.printin(Do postGet et response.setContentifype("text/html"); public class Nexel extends HttpServiat ( outprintinahtml>"), public void doGet(httpServletRequest request, outpinnsbodybgcolor-Yightblue">"): HttpServletResponse response) outprintin("); throws IOException, Servetexception outprintln("xtitle> Nexel Application Deliver Platform "), outprintln("shead>"); Pin routsc responsegetWriter();4- to outprintin(<body>");flout.printin(rb.getString("requestparansparams-in-req) + "<br>). HApp Launching Formate http:llhostname:port/ if(ekd=null&&eid.length()>1&&appid=null&&appid.length() 0) { servetname?appName=app&users-user1; dispatchEvent(request, response,appidcided); String appName=request getParameter(appName"); return; Sting users requestigetParameter"user); } flApp Messaging Format http://hostname:port if (appName is null&& user = null) { Servietname?appid-Fappid&ctitid=cid&key=key&eventid-eid&evparam=param out.printin("Application="appName); String eid-requestigetParameter(eventid"); out.printin("users-user): String appid=requestigetParameter"appid"); launchApp(request, response, appName, user); String cid=request.getParameter(ctrlid); System.out.println("Serviet } elselout.printin(rb-getString("requestparams, ( no-params)), Path="+request.getServietPath()+"servername="trequestigetRemoteAddr()+ } port="trequestigetServerPort0+"pathlnfo="+request getPathlnfo()+"URI="+re questigetRequestURIC)+"path translated="+request getPathTranslated()); </p><p>FIG. 14 U.S. Patent Sep. 29, 2009 Sheet 15 of 20 US 7,596,791 B2 </p><p>730 </p><p> class com.nexawebserver.Nexel protected void launchApp(HttpServietRequest request, httpServletResponse response, Sting applane, </p><p> outprintin(-P-h1>Nexel Application Delivery P </div> </article> </div> </div> </div> <script type="text/javascript" async crossorigin="anonymous" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8519364510543070"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script> var docId = 'a28ee8542833e300cb9962b728d45edd'; var endPage = 1; var totalPage = 39; var pfLoading = false; window.addEventListener('scroll', function () { if (pfLoading) return; var $now = $('.article-imgview .pf').eq(endPage - 1); if (document.documentElement.scrollTop + $(window).height() > $now.offset().top) { pfLoading = true; endPage++; if (endPage > totalPage) return; var imgEle = new Image(); var imgsrc = "//data.docslib.org/img/a28ee8542833e300cb9962b728d45edd-" + endPage + (endPage > 3 ? ".jpg" : ".webp"); imgEle.src = imgsrc; var $imgLoad = $('<div class="pf" id="pf' + endPage + '"><img src="/loading.gif"></div>'); $('.article-imgview').append($imgLoad); imgEle.addEventListener('load', function () { $imgLoad.find('img').attr('src', imgsrc); pfLoading = false }); if (endPage < 7) { adcall('pf' + endPage); } } }, { passive: true }); </script> <script> var sc_project = 11552861; var sc_invisible = 1; var sc_security = "b956b151"; </script> <script src="https://www.statcounter.com/counter/counter.js" async></script> </html>