From 9b1896a43d37f6f58374a732fd23912fd26a6cf3 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 23 Apr 2009 16:32:39 +0000 Subject: [PATCH] Create Argeo SLC RIA project git-svn-id: https://svn.argeo.org/slc/trunk@2330 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- server/org.argeo.slc.ria/.classpath | 6 + server/org.argeo.slc.ria/.project | 25 + .../.settings/org.eclipse.jdt.core.prefs | 12 + server/org.argeo.slc.ria/QooxdooReadme.txt | 10 + server/org.argeo.slc.ria/config.json | 225 ++++++ server/org.argeo.slc.ria/doc/Architecture.gif | Bin 0 -> 34826 bytes .../doc/Argeo-RIA-DeveloperDoc.odt | Bin 0 -> 65422 bytes server/org.argeo.slc.ria/doc/config.json | 203 ++++++ server/org.argeo.slc.ria/pom.xml | 159 +++++ .../src/assembly/ria-slc.xml | 17 + server/org.argeo.slc.ria/src/assembly/ria.xml | 17 + .../jetty/jetty-test-local.xml.template | 34 + .../src/main/config/jetty/jetty-test.xml | 34 + .../src/main/config/jetty/webdefault.xml | 402 +++++++++++ .../config/tomcat/org.argeo.slc.webapp.xml | 23 + .../src/main/webapp/META-INF/MANIFEST.MF | 4 + .../webapp/argeo-ria-lib/sample/Manifest.json | 34 + .../class/org/argeo/ria/sample/Applet.js | 97 +++ .../sample/class/org/argeo/ria/sample/List.js | 123 ++++ .../class/org/argeo/ria/sample/Perspective.js | 47 ++ .../class/org/argeo/ria/sample/__init__.js | 3 + .../argeo-ria-lib/slc-web/Manifest.json | 34 + .../org/argeo/slc/web/LauncherPerspective.js | 58 ++ .../class/org/argeo/slc/web/Perspective.js | 56 ++ .../class/org/argeo/slc/web/TestList.js | 459 ++++++++++++ .../class/org/argeo/slc/web/XmlRenderer.js | 69 ++ .../class/org/argeo/slc/web/__init__.js | 3 + .../webapp/argeo-ria-lib/slc/Manifest.json | 34 + .../slc/class/org/argeo/slc/ria/Applet.js | 295 ++++++++ .../class/org/argeo/slc/ria/LauncherApplet.js | 480 +++++++++++++ .../org/argeo/slc/ria/NewLauncherApplet.js | 580 +++++++++++++++ .../slc/class/org/argeo/slc/ria/SlcApi.js | 288 ++++++++ .../org/argeo/slc/ria/SlcExecLoggerApplet.js | 131 ++++ .../org/argeo/slc/ria/SlcExecutionMessage.js | 131 ++++ .../org/argeo/slc/ria/StatusCellRenderer.js | 63 ++ .../slc/class/org/argeo/slc/ria/__init__.js | 5 + .../argeo/slc/ria/execution/BatchEntrySpec.js | 87 +++ .../class/org/argeo/slc/ria/execution/Flow.js | 104 +++ .../org/argeo/slc/ria/execution/Message.js | 148 ++++ .../org/argeo/slc/ria/execution/Module.js | 122 ++++ .../class/org/argeo/slc/ria/execution/Spec.js | 72 ++ .../org/argeo/slc/ria/execution/SpecEditor.js | 254 +++++++ .../org/argeo/slc/ria/execution/Value.js | 129 ++++ .../main/webapp/argeo-ria-src/Manifest.json | 34 + .../class/org/argeo/ria/Application.js | 278 ++++++++ .../class/org/argeo/ria/__init__.js | 15 + .../argeo/ria/components/DynamicTreeFolder.js | 150 ++++ .../argeo/ria/components/ILoadStatusable.js | 19 + .../org/argeo/ria/components/IPerspective.js | 45 ++ .../class/org/argeo/ria/components/IView.js | 56 ++ .../class/org/argeo/ria/components/Logger.js | 128 ++++ .../class/org/argeo/ria/components/Modal.js | 161 +++++ .../argeo/ria/components/TabbedViewPane.js | 183 +++++ .../org/argeo/ria/components/ViewPane.js | 250 +++++++ .../org/argeo/ria/components/ViewSelection.js | 85 +++ .../org/argeo/ria/components/ViewsManager.js | 112 +++ .../org/argeo/ria/components/__init__.js | 5 + .../class/org/argeo/ria/event/Command.js | 248 +++++++ .../org/argeo/ria/event/CommandsManager.js | 453 ++++++++++++ .../class/org/argeo/ria/event/ReloadEvent.js | 34 + .../class/org/argeo/ria/event/__init__.js | 5 + .../class/org/argeo/ria/remote/JmsClient.js | 192 +++++ .../org/argeo/ria/remote/RequestManager.js | 157 +++++ .../class/org/argeo/ria/remote/__init__.js | 4 + .../class/org/argeo/ria/test/DemoTest.js | 55 ++ .../class/org/argeo/ria/test/__init__.js | 4 + .../class/org/argeo/ria/util/Element.js | 177 +++++ .../argeo/ria/util/TreeDataCellRenderer.js | 665 ++++++++++++++++++ .../class/org/argeo/ria/util/__init__.js | 5 + .../src/main/webapp/argeo-ria-src/index.html | 8 + .../resource/slc/ajax-loader.gif | Bin 0 -> 847 bytes .../argeo-ria-src/resource/slc/dialog-ok.png | Bin 0 -> 582 bytes .../resource/slc/document-open-recent.png | Bin 0 -> 973 bytes .../resource/slc/document-open.png | Bin 0 -> 548 bytes .../resource/slc/document-print.png | Bin 0 -> 670 bytes .../argeo-ria-src/resource/slc/edit-copy.png | Bin 0 -> 511 bytes .../resource/slc/edit-delete.png | Bin 0 -> 847 bytes .../argeo-ria-src/resource/slc/flag.png | Bin 0 -> 745 bytes .../argeo-ria-src/resource/slc/folder-new.png | Bin 0 -> 598 bytes .../argeo-ria-src/resource/slc/folder.png | Bin 0 -> 397 bytes .../argeo-ria-src/resource/slc/go-bottom.png | Bin 0 -> 768 bytes .../argeo-ria-src/resource/slc/go-down.png | Bin 0 -> 553 bytes .../argeo-ria-src/resource/slc/go-left.png | Bin 0 -> 775 bytes .../argeo-ria-src/resource/slc/go-right.png | Bin 0 -> 775 bytes .../argeo-ria-src/resource/slc/go-top.png | Bin 0 -> 785 bytes .../argeo-ria-src/resource/slc/help-about.png | Bin 0 -> 735 bytes .../resource/slc/help-contents.png | Bin 0 -> 689 bytes .../argeo-ria-src/resource/slc/list-add.png | Bin 0 -> 626 bytes .../resource/slc/media-playback-start-32.png | Bin 0 -> 2036 bytes .../resource/slc/media-playback-start.png | Bin 0 -> 889 bytes .../argeo-ria-src/resource/slc/mime-pdf.png | Bin 0 -> 747 bytes .../argeo-ria-src/resource/slc/mime-xls.png | Bin 0 -> 623 bytes .../argeo-ria-src/resource/slc/mime-xml.png | Bin 0 -> 1109 bytes .../argeo-ria-src/resource/slc/mime-xsl.png | Bin 0 -> 794 bytes .../resource/slc/office-chart.png | Bin 0 -> 877 bytes .../resource/slc/process-stop.png | Bin 0 -> 762 bytes .../resource/slc/system-shutdown.png | Bin 0 -> 785 bytes .../argeo-ria-src/resource/slc/test.png | Bin 0 -> 2478 bytes .../resource/slc/utilities-terminal.png | Bin 0 -> 548 bytes .../resource/slc/view-pane-tree.png | Bin 0 -> 456 bytes .../resource/slc/view-refresh.png | Bin 0 -> 934 bytes .../resource/slc/window-close.png | Bin 0 -> 821 bytes .../resource/slc/zoom-fit-best.png | Bin 0 -> 566 bytes .../argeo-ria-src/translation/readme.txt | 3 + .../src/main/webapp/index.jsp | 5 + .../webapp/old/WEB-INF/applicationContext.xml | 21 + .../old/WEB-INF/classes/log4j.properties | 35 + .../main/webapp/old/WEB-INF/doc-servlet.xml | 10 + .../old/WEB-INF/slc-service-servlet.xml | 9 + .../webapp/old/WEB-INF/slc-ws-servlet.xml | 7 + .../src/main/webapp/old/WEB-INF/web-osgi.xml | 142 ++++ .../src/main/webapp/old/WEB-INF/web.xml | 122 ++++ .../main/webapp/old/WEB-INF/xslt-servlet.xml | 29 + .../webapp/old/WEB-INF/xslt/resultView.xsl | 51 ++ .../main/webapp/old/WEB-INF/xslt/viewXml.xsl | 10 + .../src/main/webapp/old/style.css | 174 +++++ .../src/main/webapp/old/test-amq/send.html | 7 + .../src/main/webapp/old/test-amq/send.js | 3 + 118 files changed, 9233 insertions(+) create mode 100644 server/org.argeo.slc.ria/.classpath create mode 100644 server/org.argeo.slc.ria/.project create mode 100644 server/org.argeo.slc.ria/.settings/org.eclipse.jdt.core.prefs create mode 100644 server/org.argeo.slc.ria/QooxdooReadme.txt create mode 100644 server/org.argeo.slc.ria/config.json create mode 100644 server/org.argeo.slc.ria/doc/Architecture.gif create mode 100644 server/org.argeo.slc.ria/doc/Argeo-RIA-DeveloperDoc.odt create mode 100644 server/org.argeo.slc.ria/doc/config.json create mode 100644 server/org.argeo.slc.ria/pom.xml create mode 100644 server/org.argeo.slc.ria/src/assembly/ria-slc.xml create mode 100644 server/org.argeo.slc.ria/src/assembly/ria.xml create mode 100644 server/org.argeo.slc.ria/src/main/config/jetty/jetty-test-local.xml.template create mode 100644 server/org.argeo.slc.ria/src/main/config/jetty/jetty-test.xml create mode 100644 server/org.argeo.slc.ria/src/main/config/jetty/webdefault.xml create mode 100644 server/org.argeo.slc.ria/src/main/config/tomcat/org.argeo.slc.webapp.xml create mode 100644 server/org.argeo.slc.ria/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/Manifest.json create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/Applet.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/List.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/Perspective.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/__init__.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/Manifest.json create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/LauncherPerspective.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/Perspective.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/TestList.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/XmlRenderer.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/__init__.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/Manifest.json create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/Applet.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/LauncherApplet.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/NewLauncherApplet.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/SlcApi.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/SlcExecLoggerApplet.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/SlcExecutionMessage.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/StatusCellRenderer.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/__init__.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/BatchEntrySpec.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Flow.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Message.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Module.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Spec.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/SpecEditor.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Value.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/Manifest.json create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/Application.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/__init__.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/DynamicTreeFolder.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/ILoadStatusable.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/IPerspective.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/IView.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/Logger.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/Modal.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/TabbedViewPane.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/ViewPane.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/ViewSelection.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/ViewsManager.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/components/__init__.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/event/Command.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/event/CommandsManager.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/event/ReloadEvent.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/event/__init__.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/remote/JmsClient.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/remote/RequestManager.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/remote/__init__.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/test/DemoTest.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/test/__init__.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/util/Element.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/util/TreeDataCellRenderer.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/class/org/argeo/ria/util/__init__.js create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/index.html create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/ajax-loader.gif create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/dialog-ok.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/document-open-recent.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/document-open.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/document-print.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/edit-copy.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/edit-delete.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/flag.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/folder-new.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/folder.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/go-bottom.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/go-down.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/go-left.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/go-right.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/go-top.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/help-about.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/help-contents.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/list-add.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/media-playback-start-32.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/media-playback-start.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/mime-pdf.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/mime-xls.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/mime-xml.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/mime-xsl.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/office-chart.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/process-stop.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/system-shutdown.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/test.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/utilities-terminal.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/view-pane-tree.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/view-refresh.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/window-close.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/resource/slc/zoom-fit-best.png create mode 100644 server/org.argeo.slc.ria/src/main/webapp/argeo-ria-src/translation/readme.txt create mode 100644 server/org.argeo.slc.ria/src/main/webapp/index.jsp create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/WEB-INF/applicationContext.xml create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/WEB-INF/classes/log4j.properties create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/WEB-INF/doc-servlet.xml create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/WEB-INF/slc-service-servlet.xml create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/WEB-INF/slc-ws-servlet.xml create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/WEB-INF/web-osgi.xml create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/WEB-INF/web.xml create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/WEB-INF/xslt-servlet.xml create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/WEB-INF/xslt/resultView.xsl create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/WEB-INF/xslt/viewXml.xsl create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/style.css create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/test-amq/send.html create mode 100644 server/org.argeo.slc.ria/src/main/webapp/old/test-amq/send.js diff --git a/server/org.argeo.slc.ria/.classpath b/server/org.argeo.slc.ria/.classpath new file mode 100644 index 000000000..d0bec0f76 --- /dev/null +++ b/server/org.argeo.slc.ria/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/server/org.argeo.slc.ria/.project b/server/org.argeo.slc.ria/.project new file mode 100644 index 000000000..d0138d1fd --- /dev/null +++ b/server/org.argeo.slc.ria/.project @@ -0,0 +1,25 @@ + + + org.argeo.slc.webapp + + + org.argeo.slc.server + org.argeo.slc.core + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/server/org.argeo.slc.ria/.settings/org.eclipse.jdt.core.prefs b/server/org.argeo.slc.ria/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..3ee8bf0ec --- /dev/null +++ b/server/org.argeo.slc.ria/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Fri Aug 29 11:27:55 CEST 2008 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/server/org.argeo.slc.ria/QooxdooReadme.txt b/server/org.argeo.slc.ria/QooxdooReadme.txt new file mode 100644 index 000000000..45d145023 --- /dev/null +++ b/server/org.argeo.slc.ria/QooxdooReadme.txt @@ -0,0 +1,10 @@ +Using the build scripts +======================= + +1/ The qooxdoo SDK must be located at +"src/main/webapp/qooxdoo-0.8-sdk" for these target to work. + +2/ Then Use the following targets : slc-source / slc-build + +generate.py slc-source : will compile the source file +generate.py slc-build : will compile the build file \ No newline at end of file diff --git a/server/org.argeo.slc.ria/config.json b/server/org.argeo.slc.ria/config.json new file mode 100644 index 000000000..00f91d82d --- /dev/null +++ b/server/org.argeo.slc.ria/config.json @@ -0,0 +1,225 @@ +{ + "name" : "ria", + + "include" : + [ + { + "path" : "${QOOXDOO_PATH}/component/apiviewer/api.json", + "as" : "apiconf" + }, + { + "path" : "${QOOXDOO_PATH}/component/testrunner/testrunner.json", + "as" : "testrunner" + } + ], + + "let" : + { + "APPLICATION" : "org.argeo.ria", + "QOOXDOO_PATH" : "src/main/webapp/qooxdoo-sdk", + "QXTHEME" : "qx.theme.Modern", + "QXICONTHEME" : ["Tango"], + "API_EXCLUDE" : ["qx.legacy.*"], + "LOCALES" : [ "en" ], + "ROOT" : "src/main/webapp/argeo-ria-src", + "BUILD_PATH" : "src/main/webapp/argeo-ria", + "RIA_LIB_PATH" : "src/main/webapp/argeo-ria-lib", + "RIA_LIB_URI" : "../argeo-ria-lib", + "CACHE" : "cache" , + "CUSTOM_PACKAGE" : "org.argeo.slc.web" + }, + + "jobs" : + { + "common" : + { + "library" : + [ + { + "manifest" : "${QOOXDOO_PATH}/framework/Manifest.json" + }, + { + "manifest" : "${RIA_LIB_PATH}/slc/Manifest.json" + }, + { + "manifest" : "${RIA_LIB_PATH}/slc-web/Manifest.json" + }, + { + "manifest" : "${ROOT}/Manifest.json" + } + ], + + "include" : + [ + "${APPLICATION}.Application", + "${CUSTOM_PACKAGE}.*", + "${QXTHEME}" + ], + + "cache" : + { + "compile" : "${CACHE}" + }, + + "settings" : + { + "qx.version" : "${QXVERSION}", + "qx.theme" : "${QXTHEME}", + "qx.application" : "${APPLICATION}.Application", + "ria.StartupPerspective":"org.argeo.slc.web.Perspective" + } + }, + + // -- source jobs -------------------------------------------------- + + "source-script" : + { + "extend" : ["common"], + + "compile-source" : + { + "file" : "${ROOT}/script/${APPLICATION}.js", + "locales" : "${LOCALES}", + "root" : "${ROOT}", + "gzip" : false + } + }, + + + "slc-source" : + { + "run" : + [ + "source-script" + ] + }, + + // -- build jobs -------------------------------------------------- + + "build-script" : + { + "extend" : ["common"], + + "variants" : + { + "qx.debug" : ["off"] + }, + + "compile-dist" : + { + "paths" : + { + "file" : "${BUILD_PATH}/script/${APPLICATION}.js", + "gzip" : false + }, + "uris" : + { + "script" : "script", + "resource" : "resource" + }, + "code" : + { + "format" : true, + "locales" : "${LOCALES}", + "optimize" : ["variables", "basecalls", "privates", "strings"] + } + /* + "file" : "${BUILD_PATH}/script/${APPLICATION}.js", + "target" : "${BUILD_PATH}", + "uri" : "script/${APPLICATION}.js", + "root" : "${BUILD_PATH}", + "format" : "on", + "locales" : "${LOCALES}", + "optimize" : ["basecalls", "variables", "privates", "strings"] + */ + } + }, + + + "build-resources": + { + "extend" : ["common"], + + "copy-resources" : + { + "target" : "${BUILD_PATH}", + "resource-filter" : true + } + }, + + "my-build-files" : + { + "extend" : ["common"], + + "copy-files" : + { + "files" : + [ + "index.html" + ], + "source" : "${ROOT}", + "target" : "${BUILD_PATH}" + } + }, + + "slc-build" : + { + "run" : + [ + "build-resources", + "build-script", + "my-build-files" + ] + }, + + "slc-api" : + { + "extend" : ["apiconf::build"], + + "let" : + { + "APIVIEWER_ROOT" : "${QOOXDOO_PATH}/component/apiviewer", + "BUILD_PATH" : "./target/site/argeo-ria-api/", + "API_INCLUDE" : ["${APPLICATION}.*", "${CUSTOM_PACKAGE}.*"] + }, + + "library" : + [ + { + "manifest" : "${ROOT}/Manifest.json", + "uri" : ".." + }, + { + "manifest" : "${RIA_LIB_PATH}/slc-web/Manifest.json", + "uri" : "${RIA_LIB_URI}/slc-web" + }, + { + "manifest" : "${RIA_LIB_PATH}/slc/Manifest.json", + "uri" : "${RIA_LIB_URI}/slc" + } + ] + }, + + "slc-test" : + { + "extend" : ["testrunner::build"], + + "let" : + { + "TESTRUNNER_ROOT" : "${QOOXDOO_PATH}/component/testrunner", + "TEST_INCLUDE" : "${APPLICATION}.test.*", + "BUILD_PATH" : "./target/site/argeo-ria-test/" + }, + + "library" : + [ + { + "manifest" : "${ROOT}/Manifest.json", + "uri" : ".." + } + ] + } + + + } +} diff --git a/server/org.argeo.slc.ria/doc/Architecture.gif b/server/org.argeo.slc.ria/doc/Architecture.gif new file mode 100644 index 0000000000000000000000000000000000000000..50fa8eb5a2ecc12da162795fb8bbc16957ceef89 GIT binary patch literal 34826 zcmWh!cRbba7ysPh-fQ2G?5vQTz2eH=duCiadxVg2ZON*H23gtTn%S-ySvO>pO$Z?) z^)uwa}S^tAkYMn-y3 z|Cfo_gzfEZWoORMZF!_z;%7Mwy&?Rmy?rgY-}7KAJ5M(=$#o2kBE?X*;CRt!z!X3 z92{I-UCl0G@aNB;=UHVF%X6BVn$_(ici&OZOpg5f_pePuXLD})#ful^<>iaL#d3*G ze0+S3{Xd%Az5L33cUs$PYHC)0ZT1gMm?qbBc6RnnESfn78-Ey_nVI=f`;wB9GP9%H zFx7xYO{JouBE9v8Yhi+OrZXOopBWwwu1qH}dzjGhsd8}P@#DwwC5fk}r|QD0>w|+y zC9QsbPutqs{8IBMLP_|a@fhbB8Ec8me98vg%z5K_vIWH#CMNK+KW7(L>F!B4roIx0 zw7kQ7?`6aHou=^1KY#ob9|%4*RML6uk9n2$u86{lv=mnwANS(N?8MlQxs9czd;Qem z)%fZ8$@Pixv-S1he2jvcNq*N4Av3Yj{Jgo9&0iZEhN+}_FL=gIYqUv+&#L+`W(vb ze*O9d__hhio5jV&VVai8YuglJjrd|BhLYj*dS3Hng&`;-znUF!&9F!R+m9%BBq%+V}_)lP5SG(Do|@jO!mi~O zG~#=|ejT6)>get5O^8oqis+i1on2esZfIy=499)>@}<76p{S^+si|o&G~&mPABSg` zTie@zPmVcdO#ye`jg9q^l9G+h&7Iv}p1$7AB^mFWt*c~F6F(*v#=6(mR{V4M@L5l0)hWO$^!q-1pq++2*gb4*xasY1U0YK05-2D9?7Bk zQN1R=?u;+QPv%JVs?!gSDTBGKC$!eblHc8u=jgbZ23(u6XPd zDw>2@v%chef%+R>>u>d?6UF)kn%SBSWk1Tz>)aN&x@w-JfHfodf~^<5|W)X`d`dBDhMHqsSz-m!sk1`f0($20Tb1QOA;%IHthum3Y=T zp49}-j3=uvc#29^6ZsprS6>SE^Q?OOZP@UlXU!f421WGF^NOsm@ip z{#sk&*ZLcM)%zRi#-^?tZ_S-cH!`#smNzodarZZ~95Y-u-#sZR-F)xS_-pfnPyhX` zkN#7xTiHRIrCT|nDWy7Ti_DHTkjC3?+j$99jYIiK5vQsac&&%PDx>g+fHdo5y>xpj2|~L&xMKbKp9j&<+fYdv{|-W)pokGTaAP9?O}Uq z-S=whA7$Wbhb4CR>hP+3zw0MW-G4XCIG6u!TnOC#{bf0hZ@+0h!+pPbyXcZ1Q9gT6E)O+zFB_Iadot%7h_3X9YeRmYvy!*|TwR|h@ooTs$yC^eIul&I8_orKI+T(acYOCUSRPJo=cnk$^ z7iz7fxG3{d#^Aq=YfJt%TLiDHo^%1~Hy-R4@C@`Ff`J z&BbE5?uIZu9pTO&2O*Q)B>RPPUCc(n6K%m%t?TMlD|`R^j< z`W}w3tv^2oKN1KW=wbPn7H^{-dxsFN-pkJLCqbQwohoynmum_PBlFLvDOT^}wY(+r zaQHDiWhH^-DAh+U)cTg1FSvVz<0W^(DzWMxr3d?INd^@}E3_a|7H}1yg4ekdT+$}9 zpXS4ZkGl=m70ZKJ!)+^sS#t_YIXAM)I_$3$DJA)+N>FDG@qVxG}ZlQhS3_eD` znY`M3u=HX$WbQcUe7IQtY>+S({_pq`Kwg4^TMlbD3+gYeSy5PY;p1wf(kYU8?(5JS z#6POfryF^qB9v&5=sXGK!4d=^eF)pkiV7!Wi5=!VzP zvZzrp1zzV(@fTDYeoOSQJSHO_;ZmA5H}Iuu@Tdnb(2`wnr}mHCT;l3U7sdWn997&9&2ShlD}+25O?( zGsdyPz@80p>$GIn$>(r#S0%{&bgy9sQ`1a2G0!Ee|46*ZH^i3l za^_1*Mx_Li+miWrU2y_-mFZtkpJ}DWyTTkacH};wG&rDdE-aqEs=ebVgEEPeStTww zhbSGNKaSf86!{v|?fzwGaX;j&b(y?6=F~!OI8X4;cn|97T)fW+24(k2ZHKOuDvnSf0j;V&bxm9?dO)nf^THlpiQ{ySS5XP z(AX+7QFv_B!YrE2|i6czRkzQ@%)ERk^_w$t)cS)1KXA3sj~&SPf0DqoR*?g?(*>O zHj(GV&!CnK#{`5zO5MjT?Jb%4i_xIbx}3A&E&0ofF${&+^J%R?M&5J;Ur=oRo$Do) z;-HRug1+G<%d2{u&%U4Q)P!%fQgn2qz9$FPm#9@fp_9rR|0E$^_TvvsmAhpkQ?Mq& ziH-E)_4~;KjDK-9Hu_GT%v4@S12$e~&;Gw_7~m3jq|J7u8DLLk4pM=C1UYTfqQ2{y zo)Xgvv^{y_``w)>pwae^r^*<(<=DKQo%a~7G6YVm5AS0zNZSjUzg#*W{nBwZau9xb z`4gaQ!ohV9ql&ZQwi?*l_)C`zWLKDJ%ujl>1a@_z8E{#F-F(1Dca=^M{8Knl!f#JE zbw<<_7oix(IOXe`8r?Q|qw=RWdC@l&VoqBvjQM6O=$FiRwFR+l%wM@q6y=Fp_!S;2 zWzpg9DI2nsIMbMa-yHf;^f`@>xqowmV8AxZ%CL*>5k0NWiP<440;ShFH$8gV*n0ij zC-wOpahSf@_1bH`+=eArPmEQk(pGpxJioTJU#Ai7U|?G|fs{aTd%=p9b*XjzUiEqB z-KB%*&d{n?E6=#)u9y#lAY0cgA(jfEM(h3q zSrgi9^Abe2Z?3lWI{!_N-JG@(t`Ac?ueS6E|KIz=Wvrl zFl0I0L=aYTLo^1l4F!0Jh?_9Fcno|y7=n(3mtep%kzjQUT~OrhCJg&PWKKL84Nv4Q zYvgSnQYm4emX(NSJ5nrxOjHVx!bTDEkmlS0bE`+A=wcp8#VDJ{s0PJ=5cHt)=gV-Z z0v{OYN$80%V5lDLI2jp39RNxQ8^ysvGokI0fEgXe2^O8WOvb_^7Xd_T(_!4#W7X;6 z{iNdk&Eo@u;)Al{Lz?14XX3-p<1vT?e{QqD_-Bzp2?+`DteFW(hy+an0^`Vm`CT6e zAf&hf%=kLl=$9AA0LB4<0ps9H&t8Ct(~#_3Js@p72H6tKM+iGjop z9X<&Q2n-JWGaHvKKL-Q-9*;gzVuUP3{ zvrE6`w0O-G{2IRv{r5E@W;^054v~aP6_I`;X7NTM_>C0d-5Z(aH*&LYH2AIgySJ9jZ>?tE+FZOv(`VRAXE<79 zI9p`!T09|rCiY@H!|Ni$hn`+vI@8}GGcY(a=v`(=b7tslX81)WhCVAwIxEH^D=s)I z;ayf@b5_!9R?0(_<*DT*e(6B*WzP;@W+97AHOw! z9G?9+dhrqO`hgSsnj}+y%=aC+K7}AQd!87!aFM-CpR-Dk&RN&USsKjVvdGzK&e@yI z*}up+r2lk8|LNB+@L%aq=kGrKYyNaK`|0N56TpzWd_e}a%!P&IBHrhcwB(Y_31 zMKa`3$>h;k=Fx`a(X{|>uGt>+nJoYESQ+x!W%4;K^Q$94Jn!>)Tk`qm@&*6p3o{gm z$P|cK7D$8?NWCwRX(^E7WlMK`LiUVobedFIrcgPgQ2l+OW=o;=T%qPSgt}XyuFPj+ z%g?4EpUvNYwru%q&ilFD2W-VqWG_?XXj$YOQuO3~ky}e)T33PBzak%oVn3N;f6HR& zodN-icQ@0ZCJdDHuo#O3B4kQpEKA}-N)q0e#4~`R35g&OjwF$x^tDWBx@BobNNLvl z(kzCOWZshZ|4MTi%JOB(3N6cuLdr_qO444HRm_!D{VT&Vl)p_Z9x_j8i6o^LE@@gW ztz{@pk|{}@EAN)6=xqU7HA~toE55Z<49``JmX#G8R*cJ3PRdl)w?zDSXA}A!w27~* zKmv;lRjV>p>y}lUAypd;pp_N?gdyGjS9QoxeI!$TVp)9}QhoZba+jp)eD1#qu^M2+ zf@QJL$5@zFRhloBq!mjxkEOW89*0!&Ta-UfEC+mQ>X5*l)*7by8kWl%R>s=9j36dP zpblAEtxuebt-Xh(09Z-pd??vv>%<<{Nf4gb-E}9Hz}98pNTn|8P(wBJk89aK0A$8$ zm8>L+t@YaT^}3h!%vz)>>45&@2Gi#alBD#EyM-^&6n8G6jz$t{xiFjg8aE$k@dT+J zzUF0aj008h|wWSVbm$2TxvLe+c<)efNnFB_s{n_?a}iSpIV&Lw?$56Z_k zRU?69#^%@a#F6^V86Oa@KQzB@ZT`sDe2cXibV%~?13Vf@Vt^zm+J)@lD5BHg*_SO? z#@1Td)@oAVMH<8x3BQxpDvc(tzih>oH>Z-eWb=_$u@ZsO+6>b`SY+GiWgDKceSE&T zLKxte0BVHW=d@ah@x-#Nbzy`wV4kr(?N+n8jI4SKA|HeJJxN;sNKuok833%mrX><# zBwR3vWKy8Ip!w>tgz}v3*W8Yy$8rV2l<&19)MRA8<#w)J;*d;TR99^YLrDVng_=<0 z!|bFWq(J&Ehy_Q)z6XlL6Yo%gMyP<=L;m_SxVA7%9!(^&2XR0WX=6y_SxI(kdnWB6 z(mo&*Q}3NLhy;#w3fD8+-F2Ty0D=Vig~3%Q@~@Y@)tFvbfIrl1gOSV z#k>bKE%&XwrVK+OtdQO83ve!v{;_=iu}2bP}PLk;+Z4rY1u-S#LC)g(Xf?z%E0bsr{jtLQIS zAbv;WV_F=95s%&so!b*Dgo1tnlsl}%?H?g2xkF&cw{t4s zN(7)m0yA2qr(jYDnvBbRxE@3KC~ZUz2N`e}>F58i9g<9;NY(X6)lrmsA3-Nb(xp&g z32Z;-)hHViqHkgJY+U%?IEmvMA!58Xk+A4lw?sQe=$j9jJN}#F81BkiLZ{ zsUo1DmCM7rO2pbYXr3_4K9?9J0CT{!XfHz^jEF0vfqJyKh9@9uE#341`b!v4#*)7U z5U+t==`_Syu9OW%+?HINM+Yjw4CwWc7$QLs6e$@IV53D!k0GnlC(Y-8&ND$4$mEih zz#%%~p#st;$WdYpR5!Xl?EOPS$e0x#-jLSM<^d^tD$dDD6qYRYc|xppLhN@v>{aD# zfj+dJRp%Hxsmr0GhMjEhkqs`G{f3s+Hj;bEI#*aJ8yG#?kUZ0rJ+DhW9+KF_=?T=} zdpAXiJv<;`$nF&KZV8n9m=9#snlw~L;TG~gR?3fB$?suEN^nqn4E#Oea3Tl^a}b7= z2qV_ki2gvJT+0eVu!VI9^d*)2ujr*pG@z`n@FKTW8bwis0>OmA0t$nN@(-3C4PjP@g~6M^$ZB~#pif$*FFzUvVHZ@8Ona0qOnj)_9fl;uV#gz~ z>txVX0o~cnH)J&W^6aRM<7frGeH2NId}lGqHwXE$ToOGx(m6nJ{mo`DhkVzX_8oti zQ#fjU0#zU^Uj|5BQ!9loZH0Hpw~-gB^%OsCR{|pe1wuNEI(MP*0|G!p6of(4X)w8Z z@_BvIGOW^|u=*{$5{MO$Pbad+kSr#XObUYykT4NEBAFEujU|zVsu&h7Jv@P>V8wjv zm3BPAGLFi%HtG_&t%u7bphF@UD^Wgjxz!yK)vM$UK%P%3)$i{%hbwpPE5+~sQs5*~ z76ypX6hlZ5BML-}1&CRJfi#euGU$U1={yRQQa{4Y0{OG7_Rw*o0k>~5xv$-OkQ@V* zkOu>J5~{kje0@?5yb_cCW^^y;hnKp$91)*Dx2*pHi!kwS4%xeu1Nq)RZz&GUdQ}zb zRUfXadZtS@ppH}ukGO1)oFGM`K4cMuwB2#B;|Afd(+*WL4A|@tZu)lh70t;bg%cB+ zZFh?r4jc&#Lpp@7YC1g8yNift{iT40$h3{WlK-VoN&X!jJ%k~($%W&WNnp9~5F{{w zJPpB<*;4-Xx(jMTlks88Jqai4!U$9{JP1j&4v<6(!z!v4gMq)oz~BBuii|i?#zT#R zWfI#%4Yosyn1j>AG0>+IqNBeysgw{VG+8`BqZ;oX_67W53}kyq@mAt2{or(6m;&{Y z;w_fq7KR9h8o^*&rGdXiv7|?_qz8Xb&Nu8C_5axlU%+tZ{lcVF&i_79LS(W3^nRYS zDV*sZoYJI`%zOY0@nn1iESM2RS&#Z*2>cyfJ{`o6F`-YtqxPI4P6u+q&OgcUo&Wyi zjvTW<{;@(sQ5Rd3$R;1QmlEvnSso6g-RrqcPR~ct)W(|Bm}DoK$YJve@4$*tjIn`| z#Ka+IMUp~tlO1QrH`LvRo_v4(nw9p8si@29YmwJ%T4pdL3?*TpCmM2#QI#4|LqnWK zY^xh4J=6mgY#O)vD~x^zr*u^nJSi1+5UFFfR+;|{H~W@o{5XYSVQ>q;>OINuuLC`hDX32<~oxA>2hyqcdqcERVVq;gr$iB(yM-Bj9m zx~1Qrs&QzIyRPmclu*bKDO00HW&luEw4Sta(J+*;Vu0v9`U+380>-dH*-?5vRLW7i zY<`O^r`z2e2w|>dxrW2&!-}sxoY5Gv;2Diq>|XTk%fd0``nRq|IPd%5K&0F!)Ij{r z5h-Py=V3HR@wQJ8GT!i9OCO*+e2K?-qL;@yH87-lP4ufxsO*PR8nF;>ZDAmdRFF0Jtc)8F>9`z0E}=~LQAN2Q*?_0|bJh>iwg zj=f~rrGP5Uhd!+Nvh3Q(Ns(CzHN>s&ZV_7AFQXUac>o3so$`u z_Eq?sg5;!nql2JX_EE%gGe02rV|GV}gvZ1%1@Ax}Pd<}swB_@~R6C`G z+NUdQmu8HJ(h%>@fosWAt)7w^^wP`cn<&2mZ@zd&;~U#kp7tnb+bKOb|MOp441_ia z9YrcJgBEZs(24H%r7_T)k{o-F`e}aaxFRz&;($ktw76y z!OZ!4KOGYa0c4n)`)<5MYY@GG>`BR-j)^gU5{HDX#~2|}yM~NLK<8F876WkRDSg&5 zn#Auy3R^fmXUYz-2_4@-nhXn@cPbbIMgj44yUt79k>y9JR=^r%h8l^@1YOEBu~z`g zm{9XtuI8hjUU{8EV_e6XMKSZA$1AGRAdQes`p;=jB<6QD5Y^nK{1SFK5izNa5a>WGHWXJKdC;_OJ?Ecf_P^F#Q1B*jQ{8SCYszU{5c8im14mg&C-v8Rc>jg4ov$0^Y{B1Me{fZKW4M=bTH^-ULF)udjhO$v%h z7TyIBvHo5vgc0%qMX+d|^&jpp?;n z^)cZK2$3MiM1w;}V8|?RtB&+2D}ER%5|M>90jnDUjw)P-K%QU6<(<1rG~8^x(J9Z4 zjB-vniJU*{>J(jO0Z5I3@6v*%IAWB@q%rf-JrTg4Z0xiBt(O2Ng>gleih%VB$x7k= zvtkB|Ju7jp)fe}H5@Zp6G3?Xm%HfTefurg@GC8LR9F8 z+(o;lj1ML56n^CuJ^TPtHqM_s&-LXGNgys%%!g!A1W1*^S=AMJLWE(rlE6?m5B~z5 zAqUmWsF#r4CYg*aV5CPGHIOcg(j4h*qrp0vK{O9 za#eJha9TG$qtL{4=0~|g7+j=~BpQiBl_)GmT5|lugYeu0CwFoHQJ5=h)ti6&g=jy_ zO6GgYYu3;Iv75LMo%AXr9eV3Ww1f3LqxyJHO~{j%prbgA7^EHGYVYX{N0p=s?$keW zCH4Bd9GgG_d>LHEJkZ=7pV|*>fGnrD-)kYeua5zbKOriyw`(;|!rkWmO%b4+nD#nH z?DOJm$HsK}Wn!!`L+dSpazZI)V#yV`Gvje29K)IETNrD7-fb%4> zw>QDS7)~+gb1pJ-^@9FZdtF{O=81x=-FK1~JQQAXv7Eiz;CEB?oFd3g5H#aEhRZ+u z;NuewZ!zriaDQbj<{8z;b2XY=q9xUrvE+1Xw{xOm`FXIBuS;o$EK+#jWLL8Sw)C@7 zw7|m*wivo?2dMf$hUOQt?*lomgOlc`jvTFBb{v=5o$qQJ?^*7na!ThHQcAvgv?V=O z&26ndnN)hEW)o1XJ#Qob<}DokxPhvRu9oMF(8#v4PrhUhu&kTV@S{O8WMGX}o@zAkr=npCgk_NxvDC-n$3I(POmD#%65Rh)g{PowB zn!z@!&t3&RKGt`4%)vUo9cu1Va1NQszVR=SeKu(Z8K7;{bbTM3xxJ^b?MHY{(=RdD+p5ZRT=t1i7MGhzA z>`9V`FJ0QEn{Q65K4pVhpY-2Jz=FQHv>#M2qt-6u0T-9$40=?Q$HRz_$>N+<(7>R! z+k+@T*ygvbZR-w5FO>`@Ps+*N%$Q5?0p{JAX-tEJ4>WE9T0Sxh*+vlEJEH4>{MT@!mI)qMwR~Yg*4`xaa$x3acf0WXsGa4V3e@)IxH#hax58g` zv$O%Tv1C=7KO~$841o~^4kfC5950T~23w(E9ynMM044)C(Wu1e`1guLTm#^s?dSzx z6y+5PNv3#0jCtICNY*f~*lFt?hlxCZ<_OP zy0@DIr`)pKr=^^%BZk^6P}Qtg_1shSzEbu1NTfEYpk9&8!5I09u5H5nYiRM48bsaNW0WE!uSG+y&-yphvL*VcGzrIF#Gkr}Fym89_wsv(L} z|Ijw*Q4*i(NR+du@##tP+Rk}m1dELW^w4Z;@;Rq8WF$V0rig> z6~mg93z}7Xn$=gDSTe1eq(SW_jk>mOj{)ebHs(eTtuLWkO-WkKAGKO4v|8J=+J?2- z7qmL|v^v|eOABS#sfTB9MB0NiOBY&wjzb9akf4S3K$7<0N9{rF;dyDMZ^POn3)-W5 z!=rmKtFl@#{tz%WiV6)I)7JT6r8DI*GU*tL8}5ARkwroUMFTKs77RKwvaqi6^Gau# zOqa02G`cdWv-AOBU-2?wo7SsTo z6>=m7J(e3g=8TrcKz+`2&qDRilk_e=>izTAecq&lW*xpR&wacMCtT?Pl0_|lT_-Hw(FCP=#!J{i(m((XY`Te2Dg|Es00kCJ@v2o zzy8?PgJ;FD1R2mJ8_;JPFjN{awi_^w7%(pyu>3Z-du{OF8w4A(A-jMf$3sI-9m9Lp zhIH*3N*E|tvLVwohPu*_uicRUA)cn;+uZgTxiCLJ5d9sN` zwu$i~NcZogWQno$qKUP*ywY;KG|;;Djdn^Eh!UVGa&GFcV-_%icWM}LzBYVfZ5Etu=DG;>z)d|~ zG$r)H!hf4ZT$^FY%_Eu3qXf*OADYMLn8#Y1$9c{~Sa*keM!9%^<15VxFR!Nsa?O$# zX9ylSI4T)+N$5v>T8(QK(f_fw$-;vtD$zQ;SsBm9}8v})8|gn^-hq+4S1J; z^~6K#NgeAS*49&=*3)6uGs)Jo+17KF){}j4En!VuJk}m*z(Te;VV>M(eq*|A@$uT* zsg3};&#_ZDW-IP(ctnEDuWXy0N}Jtwo4pa6--|Z;zike#Z4Sw8|1jGg-TUdDJD#aC z-|$y&#nbjI%=SFl_Tsk9T6xrxxOMp7*?Z8ri{G|g0!wS;Xa^me8-LSHfkhb~aKsZ3 z%nJ<e9KNlJ> zmnw^QHXmMk+O71#0116KE6mQETpCY=IMlPp6M+ISj}fZ`Wem#=T#+tLZ5eKzV1GYl z^>Gss{9F%#kNxpvl@EsJzlj80V|c<>*;(xG!{P)_#|Za}>^W}$(W%(GD2&*t-n}Jz z?o&O)If$19#(Am-H(%q;S!1?Yy-TsmZ{u*E3l@$6_%`8CJP|KBUJV~>XYQ!XWe>WC zP9w5{+CA9MD&z)vR?7*>@ALpPe8W`u4{eM6sfH(qETtrjsJQGY&-{F2nbVSxF zUw8~lzcU)U8L{mUJ}?%M;0Rnt{y@6`Z=DqrR`2bvMVznPS6#iLiQ}P-dG74u&gJ5H zGxqp=ljqdgj@2R9W=+g=GXlLi@4u;1Wlyl)UI|XIR~gmgHQCgp(03Z$j#%Eh&!Vq$ z^LWz8>M%YhB7_CrrO*$z2+$|E$BlXUedXS$jhq{p$BG8C)chy5|oY&nYj@>2S}P z6wlcl&$%kk`3}#8QP0IC&!v4&0vXoz;}S?B&7xY+3v1)1hXk+L?5{a{ZFzZZ)4F*G zcPu(Z<~MrL(mB80-PzvX$ExDh(xPJo^}n9#4eD-nNZ^l5Hycv6+;7GbS>i@cSD)%0 z)OUEu-N2!TdfhDeu~R+wqHzKR{)jf_Lf%`0)>}kEA9^-67U<%?NaIRFp`=9)HtNr*o{rJcH_PR4GYh)sLLzZ`%Y4mSimcdMd3k+INoe|^dTgS!ES zLIFk!0mga(Cbj{l-T`J20p_Uz7MTG6%9a+fPu=0mDH#>f6wTWi9U%;6+6u6}1LjdX zijX?ukqi{^4s?kKe3BZ-6k+GlbW~aO(=GGVMd4{w#?zzI)1HpK#*FCen^WN42{59^ zxw+L2b5NM_R)wFOs(N#(J{xX4P(wodSkC;oeS9dr?b6Ob0#AryPfjv?WUKvyst)l> zV>gZL+;B`35YI10Cq85K^f3?@6&2zju^-@rsAp zKfbNNn|{Zqod>6ZPZUuYnRsuX)Mt@f@a`#l5iVF4>^W4;Lz;E%dB!TL${%`;p~L`o zY0+^@_Eie*-VsoDo84Fz*P1W?)F}N=oVP~9&oI^gulk?7_6oY)?t}Yr_#}a7x*~L_ zGj#aNP=_CU^jSPo7_fOhWQq;2^1iS>2-v-e4-$?tLIgTUg70$wvr`Mpz5}*VAmT`X z^ZX1Z?Dj)BmIK&WLkcoOR)xaXJ_RyN`4va>3o3-)FaC#%aQC5nt{~weZ63sP6Vgq2 z*1+YVyaiW81l7CPhjeU-c|G^3I+?*<0s+9Ti;KYiX2ig5XXa{|P*69)TjQCd8XSQp z#Qfqdc}dq9LvnF_>Ef1N8b`$~5lZ*xr$G2!k;&z=mntN*0r?}ZosKxarSqEAdi*-N zH=HHnGG5_&%r*Lv8;2?e~Bgfz|3d5hwfpw8z^D5pu2d+z1~UtsL}pt za@AH&``HcsE6cyUFC!k6iOlnI{+_4FTJ1 z6+?*o^YrjQ&3l1?z@~hymsa(-hgHs!=e?LhBtkxvRU*xQHx7I8PB4gc<}{{WLm~bq z`07!l3blO8sNPKHCh?CCl)sVeeOI)M&I>bt9Ml8SP|18m3_+|>#Jo+c(d07ctTDGV zrPyL`TL!Vk!8H}5^q8Q+kD}>ufyRbf;(uurqO*x!TZYd*$Ur{(-H^{rn5nTh7AQ)) z^YX##zBOk>KQ7K!N(>g9_VC7_MH+e zf^#j*(!CqHzNQ8oy=_K@tS757gb`c7LH>5M)A#&+1$$jGdcvfCD(v1n>2dD>73*jJ zHHoner~V!PN|h-%9b5!XVI?Zg4*7S#Brj2hxAgP-5Zs&3_ffI;u~|8>znF&?eEGSBXrC7#i>>ZeSoas<22H=(1SHm|&e-uMJ=?g= z-?Wk_E7-j8{<&bwud-IJW`2HRi`#o(+1u#`mcpOgF6@%9E@fiZ+)MaLdqUWwurNgs-RS78hj8`t1#|8HL@do3zbN@sL}VBTnPH|jVN z6}+$N1FpDb$Ec{uX{Q!-pW6;H-!OwKT9lZ#&GZbMbIklKv=qGCF8OnLim`fWe~wg0 zJ?z6!b#TWZ+b2&tK7XxHe1n?rBevoz#w@ymVxGYk3$o(1T-V|4A!1_og!L?U*PKtx zgu0;I$^y9yN^)s?&7XL^`VS94oe?T-5ZGQ$iI@^v$L-VJm6hMN7Dt|b%QpnXn%{PH zT8=Yyjv86PQ<9pG8F5`r!o*7QrGq+;mK|gl5z%6mPe-@Bz95ymHX#uH9@vJ+Li^WSuI@lU(ru%x-5Lpy z8Fi#0I>tBQQHtQqdAEY623x9dG80L6|6}1Q1G~Ak=l`T0-In1tjOk_`I`>sm+~33` zLaoF38~Y__*OOn$S^Q#kMm^eye=&-PEjG%mKmx5j*RU#ds|tqp|It;M39} z>!aGtj;njZ(f5b#sOqx%$S^;O%sYy5IoK*gxx@k@${?vu+-~J zf@kX&2|s?fB3DdTpxp0gDVqE@7zz#7PqV|guu%Z2ei_H_)L7AUL~JlpYA{GOF`ka# zxB}lHR*NM`&pjjKDZsFOe=)_C2Yw#&@UT}ef(7~-YR#i^Z%!oWo6(&U;~Ax~9{sd@ zu0ksE?fWj~JtjB#Z>y7lTYhB|*+=!o^4ItEqj@Lus2WOCAMzT$DVzK(^0t%)`yO0U z0=U%Hm6^8ln%0$>RHPVz9uqmp6e#Ofw$wQ~KjgEVD4S}iZK(7jgt_P1f0I?e*jI2i z#__#4jBP(^s1Cp8Lqqsxx~LklaS!?Jsmo{jL>g;S0xINHX?{4>=DoW*=XDk>pB?d& zcu!I?ZQf7@5b?PB7?Nz6+}1a3s%>nj3KQ^f7&2{Ebt~#*6tE#j#gHF1e(AUt@QLPI zSfTpT)c;V>?@jr_hRB!Z(Xjoe9DqqF7xc@2OR>PZ^2OhNUs{*01%rC{mj1l{(zbH_ zA-LydN=R}Iae<0jhzZ~P#rT(w)Aj=k*Ydk9bBA}D?)8!z+6{xKn{Y6B;V9|~v>laQ zOL{i1!Ybbiu~AbuZ3i~?`%AmuwPx8)Ne6C!_*QSdY3jWMfjVePA?4M-885hE|OmGagoNnh{Ukb zi@H1H9oIX_UalLFtR8J!8m+`mu|5GAb7YcuUGs=nxah|<{w?W==Fz|o(VXLot%t|W zW8pVXh4C229o6%1aq?pM)XCQ595O>iVPy1!yG{>`TE;U}`QEuc*_`KXnaH^jDmRz-)webHB`)bfpkg3wq>fZF`!7#!Ys9-WxC@gpiHe2BPrL^f|Hl1 z%^NP%e>T(e^Yh=z0s&9zEt$8iH?cysmA^fow$3lzNHp~j1onO3v@UGQOSUvHzmO?x zUEB|sYzt%CwmJth4{^o_QBfU)9k>3xxsk;Etc-@6qu`)tUvBvW?xbmdmMJ2ndN~CD z_-{qs6*rHRb~N(5{TvEmAxI4<2_C(A)3(l~ApOm#>ga7<+s55zeWF%^$L}WEHtBd0 z;g*_>h^6_1)1?TRVSZC+kfds$V?Up{w+1i-WJLQcip`Pc-wM! zYzQ(lJ%Xn-Z>+ajuu}cvIhyah{wZt*$u6u3o;6Rj?+13uE*)2$wI8=1gvYniy#I67 zMcr{2C#hx-j!(}1P_m^UB)iTbbTRl}1vgOuK(zaDgnQ7gqa1?Vwo>Owovqwji^Zjt zkl$}}Y{%cKh=+R)LYK1>9jA?*5BHx|UoL);2T;oo52J;yR@U-)sMUeBcdJ3+2^|-s z5%MPwBmPz>y#G)2B!600ef_;)@q|n<%yWMKmT6k&)uw{NzlrLbzjdA0`wqS@810WKf!b)6g`{z#&v=x2EWTTcK7z6M}gK#*C7=Uah@9s?= zu#6!A@@Yx{GNx5gAfH{3okJp@L!O;eHJ?*=m6JW1`h1108-TM$vy-sj3uotv%je8d zA`C{|k>c$Cz zBT0}B;;IfJf&~vUI37+FJWL@J{4wacAGN}NTA&b>L&lXmW${yimUH9B>e-;(xiza! z7ztS#P+T8_bdh^tlnou#x=FMe3$=>A z-SJQ=#-WPqm1NbsR2r33z1Csrj$%i=xTato0L zP@>$XQ5RxHj|R8CN)&&Co(4v(_wTk_jISQzDtoEVr* zqJD;3Y($)!An0&+3JFn8s`@WFt50Nc-Cx6|9VLO03Lk#70_X(~5d!Cel& zxx7!E?WIA)dnUXwfUPe^65SVKK8Qd@ZxHo?+Gc-PN$k`GY&EvhMK(6y3F(||WE@cVF*am_hZZpOJ$O-`7 z7MZ$9;CT%zeO-ll#;W`^I-iYv_ubQPmRrBJ!P+SyL0 zb$#>iNgBhitp3uEqxZ8cxe*m5Nt>k(-*SyiZ6Q0QisRe+{DmPQy@pJ@`GT?3oI9_$ zcJgGp^5uC8dCLk+%Rbxi7CDy{dGQtpmKD9mfQ;P=*mp`o%1U#1%e=}0s(>7DSvjwh zWB1%;H#l6uVLY<<=U-^Dyx+!uaoDiU&WO* z@>ZIx`P!!l zaHj81>?tuA-&F6`1yMzDthGkdsQoXb@}^DEBb8s z`<*NLMfN1=w`*} zKL6Nh#n=r$9#)B`5cobk4j|R&Ce_ZpwHWpmcf9D_6n^UUVH8 z)Z9x7B>%R=-PIyGq_f~|W7Tel;9h^#UcZ+?7VK8g{;$n_QW$9J9W5xUYTwdkCxhN4 zq<4=+=!mQONKoilRrB{v&u?ANPMFYN2G#@TN}?z3e^t?EeRj!FzZ=A>&r^ghGO90h zdyiGCj|_gFHVT1k4wmI`R88LN-{aZ`M2y*p5`Yz6%StK2cBhu@t_VAKExV8ihh!~>f(WNtEvKHy zJ+s<-vVL_I7+7Zwb9^;Rga}WM;9a3?k{H~*Pa?dTY{XA5Qu*uA+8opLI?1X)q$G8 z5}zbQ>bl93PDSe;y_1LrX^Xlk)bTB#9;iioOgD-$Vo1cI6`HzTj{+ZXM3bN-{HW_} zsF_t>a%(-tIzMgnSHikLn4f4JvoNeuqz58^Gx2AVB0V_ou}0Az3}2E2t@=~Z7?c~M+AwTD~Yy&Xa^b<=ul#X zPBG<8t_Nr2bk7pwafy-;AJQ)h9z3a+5ZX4yxOf6Cp)N=aa26G7Qt$!1o}E+lO1WkJ z4`o1_zw(F!d5jP9aVPnPKKKpD_b_V!fA_a!BV9^IiGT|*fg3oRn=gVZI2POhD}1;= z7$Peu0f!IskQ;M%qozMlxIbj&lizlF%Q!L5z#FgvGH3vB!#6DK05Z734&1xRumS~4IWb?in2$MR`?q&WW}3V2nzuQ#@3EGsuMW4dS06Vs4|}DTwGxoGo_D%( z12-}>gOonGee?Pz7IQjxcZ&luh@(4ugEt_jdnq6P_plQ)sV{h)k2-trA!)OCyL-2o z3v;~>JA9WqYIir11G1QRHx?Y|LEpd*z``=$0DBYrV;g(Xy+B_l`}Qt-vv)l5zB#oo z^RU-D2WUW^4>Oe0J8t*6kcNAQbAS@8_-zYmuv2??i@*-}crz5dkN5k%rcSKm7aAH@%jt=ENKP4e0!zC+T2rI)m#vGrz%#Q@mqa{A6dmnhSPS znz6^Hee!~QGrK!`8^8|0J;V>QD=5K_@4$*1{EACFk(V}9{c^n8=RWJQJv0A$2>d=Wg!+@e_{2xU8)$$M*nBe>za~yO z-2c9>@8PBkbCOOea2o)zX};pS`*CCc4rsn=8Z+E~zds;)TCz6>>;U;AI)wlJ^gsQ) z?|=r7cz3fx2&jLa$32nn_o4%Y27w{`74+APph15c6gG7D5Mo4$6Dd}-coAbpg&{=r z^Y{^D$d5tXSTK2ViAa?zS+;cf5@t-9Gh2G#S7U{_fBg9U`)6vDDW5}$`UEQU-z|P0 zGSuMrt7ufIQ>j+9dKGI{ty{Tv_4*b6Y}lvs#wvZNtZT# z8g*)|WX+;g%eJ4}mvH4KG<+MPfg8AaKV*fhAr^+ci5E9M5wYXNj4hOy{2Y4p=#_Ks z?D@ZTY?RdmMgz`Sa=5FP>a^NyZPHOZWdDK$fVx z?7Ho!+RiiYLNkxS1|575!l}@6ZN1pqo9#XOG~AHG4n4fDBgmFJ>46{uJP}3d2DC0S zqz=q3LC_+ck;WQr6m3HFV3W=NCE7mx5y&8g9MT{B9vjglH&R@ZNyk>i3_BO6La;j- zZ@d!AEV0b-HTK-&&6Q>_GQa>24G19w6#^@=A=@GflgK#b%*e>cN_c=d0-D^DPXTYL z4oU;3gt5x+v^*5iM91T@LLOW4@is^+lGHvdLWrgrEOvlpp@zhqh|)Pl9o3*Z?ZlI@ zl=@t?&nFAa?nR_xG*r=AZN1eiMt8ih#|$%~U1bZE-U~Kcf}biY>m_Ctbb7(5?`~ydmCb*iwQO z+Gs;2uMl?QK+QMEDKf)l4VsG;4aDT2UN=4VM}=r;n@a^O{Bgx)e_$ZDAW7%4ndi6| z+8N{`#q2rMf~^kn;K!(7?tyL^{yM;iql{SALKnms?X(Zo*upRCx>wzVIM4t%+Tsr3 z>8VwitLcb*+}WQU-dMAs;R*trp`VpN^NshECTO^&7it!Ag{r<9^A59qjDS4B{#?aB z34~ZXi4{~E_0(--+fkM-uL!V$)(k-ja_vT1U%mN${ckZ@QR0mm{wgR;#QSb0FMkO4 z_YHdOElBd%mG5-_=w@Ee9DDjUR}R&a4gei|$;1{^Dk>*FTlMtSU$m_Bx@?={y0D0g zHk{3Mg|=f^nQLd--e`s#jguGQX7C1AAcJW;AX8pkF|GOegJs9^#|?z$qyG_0OrNq8 zrZg284cvfOWn#z!Y4bpq(dIYVQ=xsf=a>?3%|zjoAx*{yt3j3ReCyNU4pYNAUOmcJ z7-5B_;sUO~7$94h;#ml=ATDE-30yGXK$*5Ru!As>El4cL6v?DK4x}k*OgthL!KFkt z73555n%xb+*r_45kriJo;-$c~LOaT*g^t-8WArpbKf5cTm_sRLuV7hBV;WPIiLnB6sE|u%?lM-N%waI8Dav62 z@tE1vrV5jp82y~&1$xB;+Ylao~r@UsYX@Ao)h)bmgy^B7?M`0pd3iszqpDN^2 z&CqH8L6C9LranYwGyADcmpW60)U>GO8dy#h!qe(44;eb$+5QlEJK2%UAY6?I-zLe? znFOJhItZyBM_QDU?h~bXwU|mp!qSL%Oa<@?77SoOkicR=iamuF41^Xi#0HB4BqLg2 z%M@5{slWhANEsHmg;Y1uMr0}oUXc(RFcrYSa0OYcVM8!Qcws>aHu)VLThyG0^bfrpk_SH!DRDu|bV3-Z4LZqWcA_6LOvg5Sd_6~n2e zuq%?mVSgAfV1>(_3ij&?3V&F`;)QTDv}?P#cr0MkYA_08mt3h)_`n9dfwMTwR!Ndq zCUC81dcn8ep|lr$@YV9#+DD;XEm9+ZjSJrr=NFFw_FQOcYC?u{=3t@ecnTJi$OH&c z>hVuZ##0CzcTncONv#=+Lz4k^_a44MO|FI0qimV3PNvx zY(8;C3*uw(?rd5GoT{e%f!1iipr=PuUTSXugK7CWYJr=nfWzut2<`@Y3GubHsaFtb zk2u@TYP8gH95`1(2_}*)j zagS`gAqEJOn9j~K1h*KCLRJ9?hek!e2>u|LJ?hz!5mEd_w5v0J{N55@y}b=*^R58l z$(2`miz@F1m`An)o8-yexesJM^$!b72dJTcke^U@BIM$MaIvYpfxz~J;&}{YG(ie zd#L;xVnxVbsqmS2)Fge>{;If7NcVmp0L3Hx;*TOo&qJ(d*=EM~Dgu8P??VibRPbk^ zOsz={fH`7l|M;Z;^y&Ws&;wCp0NV+kMvw$I#QtWYma;Dcn`8t3DXs%Q5C%sh1WS+x zYmkMi4@L0L0`zYM9R}h8#fI|91!FA+ix4bkP)HIGB5KM8n{Y@@P$n#pF?w)MT97-Y z$q2JBERgU+1Z?^wVh57P3CHk5pim}iDU+x$MXXTow9pN6rOR|=V~D9P!pir)MfQ-d zfo{M7pO1L(N8f;B_&9H9;DX+?CAG*<5jDgNV?qZTP7T-a2VX^yNXq|+@C`FjLgMg! zS_hy+kf4(5ftV;63drhsMhSF-An+?wRBq}tK!kV(3-F6v6iQ_LCB+s|7a0);Q6ynb zLarhaMc5FOG|?EXf(yf}Ou`Flc#Q&rMztsa2KFY<{%kn^7@~HXq1u{F^~&Y_b`c!m zqY+_(o=!p-hj9`~Cz`I%q>j-Yi6R;4+ghiSr* zAStOAQKXj8>m2`s7_smjAMzjK5hGSeAtmx6LZES!2yhll<&+>=;-Y}QsIvS*37+TW0t*>n z0k`r38FCRNpE8yX@D1unuWt(58yi6?{5l5h+# zg~|;o-%>AB@+E%JB!bZ@rvoO*#}YXZ6SYzcxsss&l+bcOQ82;~E)VlC6h<)@lSC8} zCW?VEl;ke)(lR1WFYW3Q{qh|FlOn)UA{vM|m=G~Xvnv_XG!^Cn-ikRUlQIE?5 zD^4@rkTXfsHrwhnbJHAWVl`RwIj~YTXEO_H^EQiN*h!~SrkcM6h@s;Mt9RbKk7ywBS&|XHaW3Teu$llqZphNL7%iBD!@rybV951 zPW2Q?i{Vc_v;+>|NBOiM+S5<<6j7l-LL;IWO5{w@R4QGfK4YRr+mt*j6A1g0y)qL{ zhf_|!%#?UTQ9V>p71d9vpgI+`JEDAh>+TeUi^)gNHBMPJlaE5Hp*G*R)iJzX_h$5lcd zR3h9UQi+uYjnx8Zf-0GHKRxv|CoVRj^I5$wTIpg5+`tWhwFKNi2XsI~u~l1Tm0Wee z4GQ!C0##3gKw&#)Lj_h{6{1nMm0fGlUE!56mQ`K>i9ca;CiC?J_qCWrG-FF}W6P^! zKNd$r)?P=JWO=ky=MbC5Fk#FzW#MUMWg=c(7G&vF9n0xnb#!KD&1830Y2%}3W8!Cl z)+L*&=J(Nsq*LF7-cUeMrU&3>H zHzcHXcrDI!`GQp|S5L_mB3=MxrQ^uBmt6DLAYLGP@w9)zk#nt=F)(m|`=Njh7`_nLE>IUz z8T3emy4u7lr4udRKTxWrBr2*M(mgrDC`~ z{I-Tu_=Z(thehK0NaTXw7jezgKhe{N>9=_4^b?2JiU&i5MFKK`afv^ohohLEfcT30 zH;Y4Ji|ewB2^fCQQ+UDny~KEor?-qjVwp~Y2QT=G-ME_IxFRgzU@d}Nr<5YBKtf%V zd=-L_pHzAsB4^`RNapw>+IE2RSdW8=k14{BoitX1paNKQZ&|biN??Hv0!s~olOxqn zFZPr%Hj^ddd>#2mAlV~y&|~pmdmh+MdFA^j|F)nt=b%9%p+DjR z8#j-&^aX-ILm^XEuNkTRL8%4$aw)Z?8S15F zI)`5(iPf}=Yucs_38yhRTW{5#AHWI_^;#)ZnV+#L~uwQL-4;z@i`i|byv{idP zWLc6YdA9SewrzWz6B}!v@;Y~$x0#l;`@yyEQw7mExVw+IE!nssce$rpmJ_m}9lD7@ zwXherx_=3`v)edjd8TFiyG3@m$NP}V`#4HKLmR?@B|^S6!hz+xzVUmv_jbM=LUK3s zzb7KVCnCQG+%_Q@uv4?Ux!S!`2fmF1st@@gQhOp?^_uB|!Xfqnbl?GIw;}G=zNZv* zFFZv5Rhl#*nJxpnyS@8&#WsH1`@wf8!i&RCM_WUenX=~_M9tK~8{)nTg0cxfl%F?S zA)9tNTSJ-D3WnMsoVg(GgrAi>Tl-YBk$kg{)C%0-s3kPBVARz4vax?9}A-yCh?yf<9*1qgKs zoOGEBLS23OtrZ=`F@nMgV5j4`)fv=vzcqEAH&zjOSk*OrYZX`HS=SM?7y^|~gF1Ep zi8NM!JjI(krkR5|)A-a;{bE#|H(WGe1s2v9)I}}8Rgs+9DT2ZqwLQaqU{jUC9eqz9 zo7_X&$}#lZ{k+Pn9NwE3W6yMs%kfxEeYy>s+iCo|>r|3lR75LuLIs(1VfRDzUBjRE zo$0yZbpW63*&y`1Af~kfmH^`SwomK)uB-E%NkUQibmM>d-(hr)S6r~Qz2L?B;C0B` zal?>{d0_7x3UmNi&AMXKU8o7#m_ND%g1OIaHAJ2C=b<32P1(aed_n(JSofXPe-)(R z`R5~>)}8*DF`D8_Ji)EquU7)iEdUZ5yyheN=HWcyt5}lmJCw5(dh0&Wfi%kh5ga0d zoW5~2w3ob-Nm)Y8G?e#SA+R)hBQ?P9o0FqAK0~>{OLyXID&wG%f7EUUnPQoIaZDBLtk`9pY$Qz^!o~VQNM=Ec)?p-jcGr| zZU6RDD);AW_jx~p%Q)5UnC69_jpeuaQ~mgDE%}unearYhtpNC4d~{$u`rUl`_p16e z?)ph3uah_AmD@N5e@q|3{ZE@Pm=wefy#DRtv!8JD2R?TJ!h%2xCHfgWh%lkTg$x@y zd@w3KlFCDmp5JJsVbs z)v{OBR`rT@D*-BB!B%h^*Q$lPdHd!K!E_?RfdU^EBm6+H;>C;`J5E^fV#bXnLDn?c zG3CmZFN1pi3_7&v(WFb~99r~f(xpxLJ&o!&wrs9&$r1?S?|=>hCH%cuLiRvhxKfua zA@HJt?g~K&=%6Cic5i>Sal@@();MzAy#1AMF5EW(>brZhtuFq+boI4&2l-t*I#uOm zn?Ltg;Q{g`P{yPGeqRM{fJfDDQ0O3>as+f|pK<=^@WObrO?VamV2u%G!9!3GM!;hp zehA`Ykzu3}M;=*56J{u>#F9&pat{Pi z!UOm{P(qT!)#XnR?~(T&0ao~9WeIK|3Egr26#1Z8V?9Vk2`@bGf|E=J;YM%9X~|`n zLxO3Xm;RtBN2c55^lU6c1SO)wBLeC17-8LC2TB&mIe8sf(T35Tb+? z^lHW$i)ayvl%04|ttj5g*{>#_jB?7J1)C#lJU-+j#4>Z0Y`QNnTb9AnLI-UH#V8u( z5<0jMrd0D%*R7a5zfg=D*j4Zq(LoO#rm|5><*1`oTk-Ul0)N-0&^nYbtW7Qfp`pZ;G_Hp!0$}Q9~(>?bA}c`5T2S}e2(O0;S(JFE8+f4lGhs7*v zu_yO)S><4Mxgv^jjASh1%pP`?GGS0cQ&Erq8L@Iii6jvrCBRS+o`}c5MR8Ur64^;e zcEv3Ua*%}VNEazrtT!rhk&J9)RnTY^0WDBe_;KV^;uw)R9%MrU(Lo+RnXx^#FGW?v zRUuD_%K9CWSeCP-D_;rASh^CE5YePTmN<}AfpV825+%so_ec2UDwV`6rpZ>BzlQ8j zmdtFXGoLvjT0X>NInt&*UeHg4xlV;sZRu&$c=7=SzCc5R<0+raWO|+ z6|e%Dz=G4Yq>F7v>zVgt`bKy*M3dDV2*yeZRf??7aK9uaKTYYK3L7kmWhM6|Ezc$`DP4)B+>5taA;5S*vQc zpPsF*RzXWp<4Q$f1W+35V#_`Mv+#wcu|-=Ei8xw>+3mKxz3uaIHe4zcSG$Wu?n36+ zRDoRcx%`c;AE%2|>k1g4*i~jh85@KQk`1_bgPmHKbpS-MSBzGWD}TVdUfGs6T}NA8 zQR%Bl`zmCPQIFz3NH_4C8PXm?6vjYN4d0Dd2iaYi!}mnO<-v&^74+ z^EH-jrvf_pDi}+HdX&G+>n|^XNm)dV?NmyD8xZqP#0i<>a+{0d%KCSo0Df_d&y30$ zFQmp_)eV9$_$ZCqhi4aU4s_hr9o-DCH~l%*QKu52-K1;IY1=NJ-?hBmSOZccq>A?l zPz)_^*|Fk->_PrUm^+65*|}qGahU^&=1>n(%?e?&q)(kUf}t97Tpo<24Wa|{ZJN_6 z<|9gB;>`eyde>ScbwW(N>RXY z+mgpN$oM2n*=CEm)}#FIil|HNbVJVC2f_BX-wp3EcDo&~~x3Ee>-UVO-vzMxB@*_B$j7>#8`dfy zw0aBeH%B_R6D~){mRKO+b~;I+E)uExyXu4|&DH7qQ+GitduF*!aD(TlyPRpe+K~#| z^TwBirIs$igF;2^&e02fRN1QXJH++Pa*0QK@P%*vXAZAj3kZ>TPd1CY-j1EQ$+s+I zU!c9*dq&r~gn`EN=OySx^1^3#FXG@?uOyO9kD9EgQx=K7}0v zlR=`xFQ)_lA)vDaR{LAurY>fAgnuD|TzD z=W_U`e=S%O)@NM6aahGsF!H4yzX2Sfk~&sE7gBLE#-V}o zUmnPQqBjumSAr(!F}9Xj=ca2esD)g`e=UPZUgd=AbSPoiSWt)|0`XK+h)vK}RnoVG zZ}@^;cuvVgV^~Lqcj$r1cZQy%hW5mUf(M6z2rP1lKLcf8c!-E(sD~I*41MT_^p}EB zw|as|iJwJ?{s)GMsEKyBh$rWW+4P5#Sc#PggPWK)Kvr~70ySA-7C?3u9~VhTVv1DJ zi2~98h@ZHIka&e|IEsQ;in9nYIt3|Yryn=vVOkM9f2J25mx#50Oc+JZ{vKpA%GX)HGT4IzQzlR7nMP zawv8JA?+oa@8VsB36O`Gn2LFVR>+uX`I!3mlMU&XMG2ResTK!vAh=O`pwl0ni8;zR zjKJd-TE}%5xjF-~Amg_n<1sML!<;|$l~Zw1rnrc)X^@M_Z<}?SF36UYS%>shbgo#A zM~5(N!;WSVY3HaF$78c@o@Cblm@GJ+ zRriaod1{}xi3WP0c!ZYX*`WFNpb*NTBPW(i^=cKGJ{O8^848(~xSN&Pp(|=!6e^-4 znxLMxpeCxJC`yzn%Az?cQ!e_V=R=}dNTY2^ElOLK~A!?<16r=VxqgvW} zT-r_qS@r1Ve1HRu0mq#Pc1= zb7yu{cT~!z_vNNx@{*oNPnysj3qQ_LLlBT zw7+Quik2I@@qiD~KUs0Kj>jFnp;2?=9#L{2&|zl|0w878Lf+&5kN;@1H~S$H%d;?7 zuR6L;`2v<q%xD!$OBG-19pX|cA4FTMOR`&GUOx9o6_vGBVF7F;Z+h!$$``sg`?mWQ zx0y@2yvDiDWS^=y9jTi`IrpF5kuJPzEUKF(NVbZQ#GaLsWfAf%MS42W<3hnjNjg_| z2)n(>0VP3KWRG-Mbk=yHQmkYIy2~38qZ_@uHoeW1foO97CYzEp4YPGW6?R}(c0?m2 zX*Vj@vmwa>j~g_yXX3hVw^zT(LQ+$_Vh1UYlE4>KC<=3B55OeA!*yn{InVJ^>2;l7 zah+zdLCJH!+!Mk{vL?ZEVNN+|unE9pd%0~0y#pL-1ezGpLV}DVFyY-q*fInKbu7NnAO_U!pX2!gklwFp>5Z zV`3*(JQcI!zsQShlv~6mb;N+E#L{cJyvbPCgICH)u!DJfM21F?oH<+!kHFQda>F_c zyJ6)uuESRhLUVJfR{A*+*lZeUkX&@>iUk$tjgwTC6*Wzk-ICn~%=x8W@@ z$u;B$7gPypsi(8d%Fk%# z&#`m>O-LjJb0uB@AM(|N&7&N>v8^0v!>>#KArQ?o!WFx%SW#qCQA7wI;K+nDxJC$5 zn#Ca@D#c6%=d*SHUDWlrtaFOmsht{Lc%v7~+Qt2WxSiXEyxWloxI6pX0~XoFE!}=0 z)XDAG&%IUAEplp#6+lL_(;d|IOmFy{+z4^q*qv3{eQ>I)6=Na0;7uyxZA<075a*5F zEv4R$l#jwS*8A9vW5|t9&5m}BFyqMo)|S$qNTzc=sGhyy-h~R^vQgc+ZQu7zV5&{r z0N7nlBOsdHExr176d92r9-RvPQyGaS9bP_#Rw)DHQxyGR3>)DHhurinRm;7LNo?Wi zjp5OXc&ng~1E@M~oS&_;I@Ovw>}*0p-kCZx%@01~G_Kf%VdD@{;X6J~`OQezqb-CP zUND}VcWgpk9!XscTu>h6#xmigedSm#V?ADK(rQqN*B>UFJHF}VF*$ybR(oLFz45YxA72@DctSxP6+bL zEAk^BIVGQQC*QgNzw&uo;}UP)2k+Z3PfQDs71(_9@}BcL4_!Pjw?1D;Kz|iNJoGFN z@kU?YNN@2WmQNx%52RQI{u3|f)(mM>|5-?xhY`7_e^mo)lWQTnD2VyNG?s=xX% z()#c8`dAVBvaemVFSfRS`&JkF{=55E(fhvdp@^^Z!aw{0Rs8aH{8o|t%Kufsf3wd2 z{G*Zk{tyDA?+UKq58>|*$iNEzQ2o}wqnMxhM?dz@TlU*e^1(fa7VG1p?+-wk|CP@H z0D;V(3Kjkg9z>Y`P~k#`4IMs&7*XOxiWMzh#F$Z|!Vn_*eFPa&q(}=TOO8aDQsqjP zEnU8Z8MCDael=E@`^S&pzkjAinc^8#C{Le2|J~yEAwvy*zlJ`A8dd64s#UFC#hO*? zR<2#We$D!UpRRvIcC1*j!=p}@1UF_3(afRSw{`8_#hX{}UcMYX%KT{ZBw)gY4If6V zlBP|ZI*I}0Fw{JrZAp|Zo5W>J}+O=)p z#+|!kVZjy>{{|jhILO5}bMEX3d8*{2NtZSS9bNi#>ea1Z6~pR|5q|_SNFYfpt-J4BbVvg%kYut+Cli7(CK+p_vdWcioKHCojp7hGA-@DOOzMan z@Who;e9|9QG)S{eHyMl)rYWtYvra5AjBLXmy%e)gKmX*4OcM)4@jy4(d^1r+#f$T$ zIqQV9#yfM&lgmBx12j`jH|0rCBMnqk304**wbZ^Eb?MPaSCw#5`gYW_GCnz_wbm~^ zCGg1qM5B4bR9}C6D+D)mAhuXzk3CjZR+k;lRV`t)R8~xFrMBAta5YmUG}8>>24KGh z7roxbCAVB=&vnmP9iie;T5I2hS3hhCJ=4%O5e+wAeW5J3-+s{rSU7bno$S(h4@UU2 zd3Ajg-+dnrHw1qtRyJUZV;Xq5Sn*4^V~@XD7}Pg8Py%9;!IhX|ikG;!WgBZU4#!v7 z-Pp&EZ^oIbkPA&zh1X67y3`P|D5hwmk48G_qF->iX_+$KvS4>}rn>5&cCI&Qt+!SX zRj0ph7H0YI)Hqs>twtMXthKe5Yq#I7&1jr9L}ty%SzLrET+aj zx(_GJZko-ud2h$x?Hi@P@iIV(Xb8vrWWy2X{3XSoYB%r4N4GWdktW9r^~_f{b@R?& zS4`{+DJ>iC#!1IrQ`1FK-LBqQ2mVdhVJAMM&xZ>A_S~26bN7&bf6D+Ef~Vfs;fpW+ zc%hP?m3i;MbRHz=gKfKd^PjvPd)T!Piu-B5hyTa$KN?>n>CeaC&GgmpoPDypd|&(o z=%M-bqkb7VVEz zjs?p{Im>O(g(_;`2f+qG_o2{+@*0bFij*sn^(AmG1mc2XC_|^wux2K_VG=$6qrxCI z5n@9mqRWiPI3z03ikV@e6SWwz4n|RZQ!HTsuQ*1pWYHq7P{F9SxJEd2(Tmv&VV2ef zx+98_jCTx64h1wQhE>EBFqj@21&JUizA<26Y|hm1xX7)T(IU+V!5}4Bo)Cgo!f!!ypiXy9@^b=yyYS|Op% z5qWhq>Lzc>8VVTV+UE{n1r_$di`j@COVorvbU_z*`(pK{J#9*|>=EvCZh! znjlM1gRnwyTW6Ke_xW%^9RFgq=Tiwjg^S5Um6;oMJxzi#fxy#*JbDdka zsuHZ5?Tl^`rwb+S7BrHzWCaZ5vR&E=6d5ycD}Y_$iXE^*lmuo4Iox^>)A|*?T2t?O z4+Gu!T5-Mz;ebF4U{{?Y0|p^@>O3>-j}7M(3m`U#JYgV^zBU%OPvz@gwfo?}O88(D3< zaLQChsFkk_6DW7t%RA;FD8Wo+F^}0LWj1sCzPypyCd4iO#Z(AgVH^=O+E*e5Pyr0o zhzupDKuK$+WRu;@&@A&)m2pPlob6&@2QTEW2l-)Xo8bySBg7TWP@_RWZIC|}^sFk- z>6#Eto;EM~N{znTmT3xU=1CeZ!+ir5K1^Evde_$tJbZwIHr|gPwPw1OtdN z8av4A49JNEl8uT31bqW!>2m2+$4$|$o)MgBU28PMQgX^&O9gHxQ*L7i@qfX<$^dU9dmuy;yJgLsZ=^<+s5-A#sm8cechzXNOH&)LOdJ?e=q> z{VYmEaoixY#TP+hqefmKoP!HrCag&)Yll-1;un$s_>A4cZFo=Ix{;KuL5v$oQ64-R z)8lW*RX|`{cFW{1QaH+k%9z>3^r|y$`2=6?pyAqFw*s*jn_OYJUQ;~ZJBS7cIM9q8 zd^(aUFs@oEK3n~M9P8jglmR$>^mHd(=~QL92(7w3tVUgcQ?H2JT|v;=$|V{Fu@`un zG4#UwWAJ=c0YQ@?cY*@imf(>)iI)UmgKWF=$ECYoT77pA=3S2N?WfSDJrZn~ct%-Z%v)A<7jCJa>PrB_tMB@RSXNoNw z_=1cWB7ba#y(%kYNH+CjDfVl>2~#Ofeail14srn3IR@gy^3Qh0}K`fOu(0UzkQ0o zM{~f@sXvE^3k8dY8{oNG`oMv}f_00e4RZzDvMq|kt#zA?wBi+Hz^y541|(F%fe@=E zB(M}KrjE-$9i%fJ>_Nc5z9ICOB5a7bxPi0U0SYibp7OagbPL`p2tSl2QDcQZY=$~C zh&#MFe=tNfDH#GJwQN(v9c)99TEM6OD=Ii7LI~_5-B>*EhzklRE8N0CKK#S_^1~b? zM7oHJL{tqnp{#=dt4LhKNo2T6hEE)ts!w;S`6F;B)NrjBb*!e-HyTwZ!O6fC4 zHB-uC0!pP5%Bd`!s_e0=#7d@YN|e}2uB4TsLVThzwH924PHabIiwV z9`ndo&C(Rk;T#g&Jhus)3)oCf%Un*tY)D%3D7YcPy*eLDI3ItOi%^A&!%ip2TdXVd>;Qqh#Z_y3LVeixKIqO zjxY1j4~4J_jmZ%u(dn2oqeD>;4N=5k(H4!47cICLP0<;p(ekVz8$C-66(0^gh!fRO zlUdL!t5G0bA|a(8A}z=xO)nK)$R%Y`&VbNZl+qgGQNys(E7c4Gb&W0M(k@LLA00<9 zg-j3O_n<)T}~m`IgMX_cQ}jR-^;IM?IWZuM4h%vIDoPjQ`3a(#%| zo5Iq{(RBTlXO*yM4HIC{iGKyyfECz*CD?*B*n>sbgjLvuW!Q!lSZY0~O3VlTZ6q?b6ZcXMOv;++qjimfE8N?v{RFv+q{k2wYAo^ zb=$2CPQ4Y}udQ2Ez1y-K+{C3?zLnU&4Klb@+{g{u!i~yRWgfGY+{|TJ#yv;JecZs+ z+|bS0IR(P8g<9OfT+vnCj^$jK^;}y8-PM&{j-}jP4cDGc*hfGBvfv3_I9Uj|1qXOo zVgOhO_yL}fgC7uHV$g-=b>8N^1qk@p5BLE&_=n^b3xIWi<`v$6eT3%C-s!ys1Q^(1 z(1l0;7z^UniRXo0=>>-14cO*I-+$fS)YS`_y=KdUg_nBVaVVOw%!Mx zUY@{Q1YlwB&0v9bfDm>J3w8`SU|;EVVX6H9o*-ce{)ZpdUK5t!g5}?=^mt-dHFW;Ep9=^E6<@HP{4}g9!%M2erd-i4N{Qw3A1{3yO1}0$>j$V8=VP!UFo}R^#IR=72q35q4vT7T7BOQSXUnj~?lQZD&8G<~1hRnNDLN{@0xU2I3hm zWPV8FUH)lm25D+md$`VH}2#hc3~1u z<3@IDBYx+X?O&``R{#!J6YgrSHtUB@>Vo}hHlAaFHQ^t&V__(2ow$Vs=H$yhWRgBv zx^Cp&-f20A;5>HYgcSri7}&w))xvh?gPm#6PT=b$hOVAz%}!?YV_FG|uB0Mu6uQ z*uKW^ttlJf3d+wqYFRhh6q@Gd^q(?{BshiP*rcHD~iSck?%g^Ej9DIj8eF zxAQy4^E}t{J?Ha2_wzpo^gXA5B@XQ+FKf(&Y#^2cod($425K7r7uemNVPLrLp5E^n zPH`(|@=X`mUAEy#kMhwr^nn$G;12R(PSwgi+{bz8M3?C!|Kkg`UY!o_SP$ucIBH$k zYkuf*F+S?J23R*nUl|AE+ve><-eov`YaZ9{GB@Ni@7r~ic1d}4)TV7jFYYuxVX}5~ zSMTRc_SXS-2Z;FH=5=(w@w<*=(dKko?%mBk4h$Avz19iYMp#Eb^|2{kyCqvzZ+2_1 z@x-=uqDE}n9@uWy2{3>3eD-W_2iVf)b?U})&<`I63VW}aYT|5tf0c90SNMlUWJfn|tv_m6USwWB>W|lnE@$|czwt1~b#A6+U|{xw zHQ{I$a$_d)EVkYy&*S55>ksJt`xRmrM(gd4U}4B(>{scX|44Cd&ttL}@id-$tatKw z_u+?j_P%F*vG?!Sw|@~e*lRXe@os;B0QT<#zk>We`~zl?pM!t878(=?p`bv5{Duwu zH}POXhz5xb{2}Mj!ip3JdNe3Z4upRW49d9$GUY;y!)O+)vBKQHg8%-R8fEGy(V{?e9O z>C&c8qfV`QHS5-{U&D?qdp7Obwr}Ikz1l-pfj{hC|Bh_1B?6on-4+B4@s>u24&(@` zY_a7^yUJ4n{&(}PMUyl^-V(M@q_DEawNuu~( z{$S5W1wDem54!w-0B{9CK#VT83^U+D9{_{gLJk1)V1&*AV;DaIPFNvMz=#MDFawg9 zVu}|6QyhyD;zXf^5MibnXP$w^k8V5i*rSg>0vV)`L;lEHR~QKcfn5#^NZoYM0k;0|C3T$sil_IxLIePg+`>OpMn~ysH2iP zn~}YxSrl-P5hV2PAh1&hlU)q&{T1Yv(ZN*?Gd?~ z<|wn%PeUEGs5B>CwbeE23@y(a``q!h|3iZ!4HBkgd!Xv2}@|g{}U3hf_~Z=@3`i>`EVwNGMpg|YiPq8;xLCg+#wHp z=))fZF^EDOA`y#d#3LdxiAr1|6PxJ7CqglbQk)_coA|7|4Jvw7+#(md=*2IBF^pmy zBN@wR#xtTZjY+&BuAS2;xUhU+#?_R=*K?-GLV8CBq0lF$U`DB zk&0X-BOB?+M?x}^a%AE2qQbHIVKS4N+$1ME>B&!a3yZz`Nlb2G%2T2;m8x7ND_iNx zSHd!uvYaI?YiY|{;xd=I+$Ar2>C0aNGnm30CNYa?%wr-mnaV__C|zi|XF@ZY(wrtW zt7*+^Vl$iC+$J}>X}Qx`?{XCLXaG6OY0h(^Go9*OCp+8e&UeByp7NY0J?m-Dd*U;n z`rIc!`{~br0yLlk9VkHyYS4osG@<33M+>1hiibipq7t1bMJsC2i()jR8r>*IJL=Jo zf;6Ne9VtmmYSNRUG^HwCDN9@G(wD+CrZSx=O($AOqg%t70{)THPvFyXw`i{`3mo94lGNYSy!&HLYr0 zD_h&@*0;hnu5z6#UF&MsyW%ykdfh8u`|8)f0yeOM9V}rBYuLjgHnECbY}f(<06W|q Bp27eC literal 0 HcmV?d00001 diff --git a/server/org.argeo.slc.ria/doc/Argeo-RIA-DeveloperDoc.odt b/server/org.argeo.slc.ria/doc/Argeo-RIA-DeveloperDoc.odt new file mode 100644 index 0000000000000000000000000000000000000000..224d3f431cf733f2f814ccdb83223cf08b0f95ce GIT binary patch literal 65422 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 ijV*to|G$Lo`M*fD-OSymf)A~P9XSekL literal 0 HcmV?d00001 diff --git a/server/org.argeo.slc.ria/doc/config.json b/server/org.argeo.slc.ria/doc/config.json new file mode 100644 index 000000000..a58ce3280 --- /dev/null +++ b/server/org.argeo.slc.ria/doc/config.json @@ -0,0 +1,203 @@ +{ + "name" : "ria", + + "include" : + [ + { + "path" : "src/main/webapp/qooxdoo-0.8-sdk/component/apiviewer/api.json", + "as" : "apiconf" + }, + { + "path" : "src/main/webapp/qooxdoo-0.8-sdk/component/testrunner/testrunner.json", + "as" : "testrunner" + } + ], + + "let" : + { + "APPLICATION" : "org.argeo.ria", + "QOOXDOO_PATH" : "src/main/webapp/qooxdoo-0.8-sdk/framework", + "QOOXDOO_URI" : "../qooxdoo-0.8-sdk/framework", + "QXTHEME" : "qx.theme.Modern", + "QXICONTHEME" : ["Tango"], + "API_EXCLUDE" : ["qx.legacy.*"], + "LOCALES" : [ "en" ], + "ROOT" : "src/main/webapp/argeo-ria-src", + "BUILD_PATH" : "src/main/webapp/argeo-ria", + "RIA_LIB_PATH" : "src/main/webapp/argeo-ria-lib", + "RIA_LIB_URI" : "../argeo-ria-lib", + "CACHE" : "cache" , + "CUSTOM_PERSPECTIVE" : "org.argeo.ria.sample.Perspective" + }, + + "jobs" : + { + "common" : + { + "library" : + [ + { + "manifest" : "${QOOXDOO_PATH}/Manifest.json", + "uri" : "${QOOXDOO_URI}" + }, + { + "manifest" : "${RIA_LIB_PATH}/sample/Manifest.json", + "uri" : "${RIA_LIB_URI}/sample" + }, + { + "manifest" : "${ROOT}/Manifest.json", + "uri" : ".." + } + ], + + "include" : + [ + "${APPLICATION}.Application", + "${CUSTOM_PERSPECTIVE}", + "${QXTHEME}" + ], + + "cache" : + { + "compile" : "${CACHE}" + }, + + "settings" : + { + "qx.version" : "${QXVERSION}", + "qx.theme" : "${QXTHEME}", + "qx.application" : "${APPLICATION}.Application", + "ria.Perspective": "${CUSTOM_PERSPECTIVE}" + } + }, + + // -- source jobs -------------------------------------------------- + + "source-script" : + { + "extend" : ["common"], + + "compile-source" : + { + "file" : "${ROOT}/script/${APPLICATION}.js", + "locales" : "${LOCALES}", + "root" : "${ROOT}" + } + }, + + + "slc-source" : + { + "run" : + [ + "source-script" + ] + }, + + // -- build jobs -------------------------------------------------- + + "build-script" : + { + "extend" : ["common"], + + "variants" : + { + "qx.debug" : ["off"] + }, + + "compile-dist" : + { + "target" : "${BUILD_PATH}", + "file" : "${BUILD_PATH}/script/${APPLICATION}.js", + "uri" : "script/${APPLICATION}.js", + "root" : "${BUILD_PATH}", + "format" : "on", + "locales" : "${LOCALES}", + "optimize" : ["basecalls", "variables", "privates", "strings"] + } + }, + + + "build-resources": + { + "extend" : ["common"], + + "copy-resources" : + { + "target" : "${BUILD_PATH}", + "resource-filter" : true + } + }, + + "my-build-files" : + { + "extend" : ["common"], + + "copy-files" : + { + "files" : + [ + "index.html" + ], + "source" : "${ROOT}", + "target" : "${BUILD_PATH}" + } + }, + + "slc-build" : + { + "run" : + [ + "build-resources", + "build-script", + "my-build-files" + ] + }, + + "slc-api" : + { + "extend" : ["apiconf::build"], + + "let" : + { + "APIVIEWER_ROOT" : "${QOOXDOO_PATH}/../component/apiviewer", + "BUILD_PATH" : "./target/site/argeo-ria-api/", + "API_INCLUDE" : ["${APPLICATION}.*", "${CUSTOM_PERSPECTIVE}"] + }, + + "library" : + [ + { + "manifest" : "${ROOT}/Manifest.json", + "uri" : ".." + }, + { + "manifest" : "${RIA_LIB_PATH}/sample/Manifest.json", + "uri" : "${RIA_LIB_URI}/sample" + } + ] + }, + + "slc-test" : + { + "extend" : ["testrunner::build"], + + "let" : + { + "TESTRUNNER_ROOT" : "${QOOXDOO_PATH}/../component/testrunner", + "TEST_INCLUDE" : "${APPLICATION}.test.*", + "BUILD_PATH" : "./target/site/argeo-ria-test/" + }, + + "library" : + [ + { + "manifest" : "${ROOT}/Manifest.json", + "uri" : ".." + } + ] + } + + + } +} diff --git a/server/org.argeo.slc.ria/pom.xml b/server/org.argeo.slc.ria/pom.xml new file mode 100644 index 000000000..efaa2b502 --- /dev/null +++ b/server/org.argeo.slc.ria/pom.xml @@ -0,0 +1,159 @@ + + 4.0.0 + + org.argeo.slc + argeo-slc + 0.11.3-SNAPSHOT + ../org.argeo.slc + + org.argeo.slc.server + org.argeo.slc.ria + jar + Argeo SLC Web UI + + + + org.apache.maven.plugins + maven-compiler-plugin + + + maven-jar-plugin + + + false + src/main/webapp/META-INF/MANIFEST.MF + + src/main/webapp + + index.jsp + argeo-ria/** + + + + + + org.argeo.slc.maven + maven-argeo-qooxdoo-plugin + 0.8.1.2 + + + env + initialize + + env + + + + slc-source + process-sources + + generate + + + slc-source + + + + slc-build + compile + + generate + + + slc-build + + + + + slc-api + site + + generate + + + slc-api + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + assembly-ria + package + + single + + + + src/assembly/ria.xml + + + + + assembly-ria-slc + package + + single + + + + src/assembly/ria-slc.xml + + + + + + + + + \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/assembly/ria-slc.xml b/server/org.argeo.slc.ria/src/assembly/ria-slc.xml new file mode 100644 index 000000000..57085d831 --- /dev/null +++ b/server/org.argeo.slc.ria/src/assembly/ria-slc.xml @@ -0,0 +1,17 @@ + + ria-slc + false + + zip + + + + src/main/webapp/argeo-ria-lib/slc + + + */** + + + + \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/assembly/ria.xml b/server/org.argeo.slc.ria/src/assembly/ria.xml new file mode 100644 index 000000000..eafd0701c --- /dev/null +++ b/server/org.argeo.slc.ria/src/assembly/ria.xml @@ -0,0 +1,17 @@ + + ria + false + + zip + + + + src/main/webapp/argeo-ria-src + + + */** + + + + \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/config/jetty/jetty-test-local.xml.template b/server/org.argeo.slc.ria/src/main/config/jetty/jetty-test-local.xml.template new file mode 100644 index 000000000..d8f927528 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/config/jetty/jetty-test-local.xml.template @@ -0,0 +1,34 @@ + + + + + + + org.mortbay.jetty.webapp.WebInfConfiguration + org.mortbay.jetty.plus.webapp.EnvConfiguration + org.mortbay.jetty.plus.webapp.Configuration + org.mortbay.jetty.webapp.JettyWebXmlConfiguration + org.mortbay.jetty.webapp.TagLibConfiguration + + + + + + + + + + jdbc/mainDs + + + + + + sa + + + + + \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/config/jetty/jetty-test.xml b/server/org.argeo.slc.ria/src/main/config/jetty/jetty-test.xml new file mode 100644 index 000000000..fda6c1692 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/config/jetty/jetty-test.xml @@ -0,0 +1,34 @@ + + + + + + + org.mortbay.jetty.webapp.WebInfConfiguration + org.mortbay.jetty.plus.webapp.EnvConfiguration + org.mortbay.jetty.plus.webapp.Configuration + org.mortbay.jetty.webapp.JettyWebXmlConfiguration + org.mortbay.jetty.webapp.TagLibConfiguration + + + + + + + + + + jdbc/mainDs + + + + + + sa + + + + + \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/config/jetty/webdefault.xml b/server/org.argeo.slc.ria/src/main/config/jetty/webdefault.xml new file mode 100644 index 000000000..e5b7ececa --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/config/jetty/webdefault.xml @@ -0,0 +1,402 @@ + + + + + + + + + + + + + + + + + + + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + + + org.mortbay.jetty.webapp.NoTLDJarPattern + start.jar|ant-.*\.jar|dojo-.*\.jar|jetty-.*\.jar|jsp-api-.*\.jar|junit-.*\.jar|servlet-api-.*\.jar|dnsns\.jar|rt\.jar|jsse\.jar|tools\.jar|sunpkcs11\.jar|sunjce_provider\.jar|xerces.*\.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + org.mortbay.jetty.servlet.DefaultServlet + + acceptRanges + true + + + dirAllowed + true + + + redirectWelcome + false + + + maxCacheSize + 256000000 + + + maxCachedFileSize + 10000000 + + + maxCachedFiles + 1000 + + + cacheType + both + + + gzip + true + + + useFileMappedBuffer + false + + + 0 + + + default / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.apache.jasper.servlet.JspServlet + + logVerbosityLevel + DEBUG + + + fork + false + + + xpoweredBy + false + + + 0 + + + + jsp + *.jsp + *.jspf + *.jspx + *.xsp + *.JSP + *.JSPF + *.JSPX + *.XSP + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + + + arISO-8859-6 + beISO-8859-5 + bgISO-8859-5 + caISO-8859-1 + csISO-8859-2 + daISO-8859-1 + deISO-8859-1 + elISO-8859-7 + enISO-8859-1 + esISO-8859-1 + etISO-8859-1 + fiISO-8859-1 + frISO-8859-1 + hrISO-8859-2 + huISO-8859-2 + isISO-8859-1 + itISO-8859-1 + iwISO-8859-8 + jaShift_JIS + koEUC-KR + ltISO-8859-2 + lvISO-8859-2 + mkISO-8859-5 + nlISO-8859-1 + noISO-8859-1 + plISO-8859-2 + ptISO-8859-1 + roISO-8859-2 + ruISO-8859-5 + shISO-8859-5 + skISO-8859-2 + slISO-8859-2 + sqISO-8859-2 + srISO-8859-5 + svISO-8859-1 + trISO-8859-9 + ukISO-8859-5 + zhGB2312 + zh_TWBig5 + + + + + Disable TRACE + / + TRACE + + + + + + diff --git a/server/org.argeo.slc.ria/src/main/config/tomcat/org.argeo.slc.webapp.xml b/server/org.argeo.slc.ria/src/main/config/tomcat/org.argeo.slc.webapp.xml new file mode 100644 index 000000000..7ec1a09a0 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/config/tomcat/org.argeo.slc.webapp.xml @@ -0,0 +1,23 @@ + + + + + + WEB-INF/web.xml + + + + + + diff --git a/server/org.argeo.slc.ria/src/main/webapp/META-INF/MANIFEST.MF b/server/org.argeo.slc.ria/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 000000000..dcd1e6c23 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,4 @@ +Bundle-Name: SLC RIA +Fragment-Host: org.argeo.slc.webapp +Bundle-SymbolicName: org.argeo.slc.ria +Bundle-Version: 1.0.0 diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/Manifest.json b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/Manifest.json new file mode 100644 index 000000000..e823935a5 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/Manifest.json @@ -0,0 +1,34 @@ +{ + "info" : + { + "name" : "org.argeo.ria.sample", + + "summary" : "Sample RIA Application", + "description" : "Basic RIA Implementation for documentation purposes", + + "homepage" : "http://www.argeo.org/", + + "license" : "LGPL", + "authors" : + [ + { + "name" : "Charles du Jeu", + "email" : "charles.dujeu@gmail.com" + } + ], + + "version" : "trunk", + "qooxdoo-versions": ["0.8"] + }, + + "provides" : + { + "namespace" : "org.argeo.ria.sample", + "encoding" : "utf-8", + "class" : "class", + "resource" : "resource", + "translation" : "translation", + "type" : "library" + } +} + diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/Applet.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/Applet.js new file mode 100644 index 000000000..4baad35a9 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/Applet.js @@ -0,0 +1,97 @@ +/** + * A simple Hello World applet for documentation purpose. + * The only associated command is the "Close" command. + */ +qx.Class.define("org.argeo.ria.sample.Applet", +{ + extend : qx.ui.container.Composite, + implement : [org.argeo.ria.components.IView], + + construct : function(){ + this.base(arguments); + this.setLayout(new qx.ui.layout.VBox()); + this.passedStatus = "PASSED"; + this.failedStatus = "FAILED"; + }, + + properties : + { + /** + * The viewPane inside which this applet is added. + */ + view : { + init : null + }, + /** + * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions} + */ + commands : { + init : { + "close" : { + label : "Close Result", + icon : "resource/slc/window-close.png", + shortcut : "Control+w", + enabled : true, + menu : "Applet", + toolbar : "result", + callback : function(e){ + // Call service to delete + this.getView().empty(); + }, + command : null + } + } + }, + viewSelection : { + nullable:false, + check:"org.argeo.ria.components.ViewSelection" + }, + instanceId : {init:"Hello Applet"}, + instanceLabel : {init:"Hello"} + + }, + + members : + { + /** + * Called at applet creation. Just registers viewPane. + * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane. + */ + init : function(viewPane, data){ + this.setView(viewPane); + this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId())); + this.data = data; + this.setInstanceId(data[0]); + this.setInstanceLabel("Hello applet #"+data[0]); + }, + + /** + * Load a given row : the data passed must be a simple data array. + * @param data {Element} The text xml description. + */ + load : function(){ + this.createHtmlGui("Hello World ! Data ID is : "+this.getInstanceId()+""); + }, + + addScroll : function(){ + return false; + }, + + close : function(){ + return false; + }, + + /** + * Create a simple HtmlElement and and insert the html string.. + * Not used but sample. + * @param htmlText {String} Html code to display. + */ + createHtmlGui : function(htmlText){ + var htmlElement = new qx.ui.embed.Html(htmlText); + htmlElement.setOverflowX("auto"); + htmlElement.setOverflowY("auto"); + this.add(htmlElement, {flex:1}); + } + + } +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/List.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/List.js new file mode 100644 index 000000000..ad3ef5c9b --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/List.js @@ -0,0 +1,123 @@ +/** + * A Basic IView implementation displaying a fake list of result and opening + * an org.argeo.ria.sample.Applet + */ +qx.Class.define("org.argeo.ria.sample.List", +{ + extend : qx.ui.container.Composite, + implement : [org.argeo.ria.components.IView], + + construct : function(){ + this.base(arguments, new qx.ui.layout.VBox()); + var model = new qx.ui.table.model.Simple(); + model.setColumns(["Test Case", "Date"]); + this.table = new qx.ui.table.Table(model, { + tableColumnModel: function(obj){ + return new qx.ui.table.columnmodel.Resize(obj) + } + }); + }, + + properties : + { + /** + * The viewPane containing this applet. + */ + view : { + init : null + }, + /** + * The applet commands. + */ + commands : { + init : { + "opentest" : { + label : "Open", + icon : "resource/slc/media-playback-start.png", + shortcut : "Control+o", + enabled : false, + menu : "Selection", + toolbar : "selection", + callback : function(e){ + var viewsManager = org.argeo.ria.components.ViewsManager.getInstance(); + var classObj = org.argeo.ria.sample.Applet; + var rowData = viewsManager.getViewPaneSelection("list").getNodes(); + var iView = viewsManager.initIViewClass(classObj, "applet", rowData[0]); + iView.load(); + }, + selectionChange : function(viewId, rowData){ + if(viewId != "list") return; + this.setEnabled(false); + if(rowData == null || !rowData.length) return; + this.setEnabled(true); + }, + command : null + } + } + }, + viewSelection : { + nullable:false, + check:"org.argeo.ria.components.ViewSelection" + }, + instanceId : {init:"0"}, + instanceLabel : {init:"Sample List"} + }, + + members : { + init : function(viewPane, data){ + this.setView(viewPane); + this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId())); + + }, + load : function(){ + // + // Customize table appearance + // + this.table.set({ + statusBarVisible: false, + showCellFocusIndicator:false, + columnVisibilityButtonVisible:false, + contextMenu : org.argeo.ria.event.CommandsManager.getInstance().createMenuFromIds(["opentest", "download", "copytocollection", "deletetest"]), + decorator : new qx.ui.decoration.Background("#fff") + }); + + // + // Link table selection changes to the standard viewSelection mechanism + // + var selectionModel = this.table.getSelectionManager().getSelectionModel(); + selectionModel.addListener("changeSelection", function(e){ + var viewSelection = this.getViewSelection(); + viewSelection.clear(); + if(!selectionModel.getSelectedCount()){ + return; + } + var ranges = selectionModel.getSelectedRanges(); + var rowData = this.table.getTableModel().getRowData(ranges[0].minIndex); + viewSelection.addNode(rowData); + }, this); + + // + // Add table to the GUI component + // + this.add(this.table, {flex:1}); + + // + // Now create fake rows + // + var model = this.table.getTableModel(); + model.addRows([ + ["Id 1","Sample 1"], + ["Id 2","Sample 2"], + ["Id 3","Sample 3"] + ]); + }, + + addScroll : function(){ + return false; + }, + + close : function(){ + + } + } +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/Perspective.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/Perspective.js new file mode 100644 index 000000000..de01afc73 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/Perspective.js @@ -0,0 +1,47 @@ +/** + * IPerspective Implementation : Horizontal split pane defining two panes, "list" and "applet". + */ +qx.Class.define("org.argeo.ria.sample.Perspective", +{ + extend : qx.core.Object, + implement : [org.argeo.ria.components.IPerspective], + + construct : function(){ + this.base(arguments); + }, + + members : { + + initViewPanes : function(viewsManager){ + + this.splitPane = new qx.ui.splitpane.Pane("horizontal"); + var topLeft = new org.argeo.ria.components.ViewPane("list", "Sample List", { + orientation : "horizontal", + min : 36 + }); + topLeft.set({width:300}); + viewsManager.registerViewPane(topLeft); + + this.splitPane.add(topLeft, 0); + var rightPane = new org.argeo.ria.components.ViewPane("applet", "Sample Applet"); + viewsManager.registerViewPane(rightPane); + this.splitPane.add(rightPane, 1); + + viewsManager.getViewPanesContainer().add(this.splitPane, {flex:1}); + + }, + + initViews : function(viewsManager){ + var view = viewsManager.initIViewClass(org.argeo.ria.sample.List, "list"); + view.load(); + }, + + remove : function(viewsManager){ + viewsManager.getViewPaneById("list").empty(); + viewsManager.getViewPaneById("applet").empty(); + viewsManager.getViewPanesContainer().remove(this.splitPane); + } + + } + +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/__init__.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/__init__.js new file mode 100644 index 000000000..009514690 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/sample/class/org/argeo/ria/sample/__init__.js @@ -0,0 +1,3 @@ +/** + * Specific classes used for training by the Argeo RIA documentation + */ \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/Manifest.json b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/Manifest.json new file mode 100644 index 000000000..ed1705eed --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/Manifest.json @@ -0,0 +1,34 @@ +{ + "info" : + { + "name" : "org.argeo.slc.web", + + "summary" : "Slc Web Application", + "description" : "RIA Implementation for SLC Web", + + "homepage" : "http://www.argeo.org/", + + "license" : "LGPL", + "authors" : + [ + { + "name" : "Charles du Jeu", + "email" : "charles.dujeu@gmail.com" + } + ], + + "version" : "trunk", + "qooxdoo-versions": ["0.8"] + }, + + "provides" : + { + "namespace" : "org.argeo.slc.web", + "encoding" : "utf-8", + "class" : "class", + "resource" : "resource", + "translation" : "translation", + "type" : "library" + } +} + diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/LauncherPerspective.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/LauncherPerspective.js new file mode 100644 index 000000000..8fb95ab80 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/LauncherPerspective.js @@ -0,0 +1,58 @@ +/** + * IPerspective Implementation : Horizontal split pane defining two panes, "list" and "applet". + */ +qx.Class.define("org.argeo.slc.web.LauncherPerspective", +{ + extend : qx.core.Object, + implement : [org.argeo.ria.components.IPerspective], + + construct : function(){ + this.base(arguments); + org.argeo.ria.util.Element.DEFAULT_NAMESPACE_MAP = {slc:"http://argeo.org/projects/slc/schemas"}; + }, + + statics : { + LABEL : "Slc Execution", + ICON : "resource/slc/utilities-terminal.png" + }, + + members : { + + _rightPane : null, + + initViewPanes : function(viewsManager){ + + this._splitPane = new qx.ui.splitpane.Pane("horizontal"); + var topLeft = new org.argeo.ria.components.ViewPane("form", "Execution Launcher", { + orientation : "horizontal", + min : 36 + }); + topLeft.set({width:290}); + viewsManager.registerViewPane(topLeft); + + this._splitPane.add(topLeft, 0); + var rightPane = new org.argeo.ria.components.ViewPane("main", "Executions Log"); + viewsManager.registerViewPane(rightPane); + this._splitPane.add(rightPane, 1); + + viewsManager.getViewPanesContainer().add(this._splitPane, {flex:1}); + + }, + + initViews : function(viewsManager){ + var formApplet = viewsManager.initIViewClass(org.argeo.slc.ria.NewLauncherApplet, "form"); + formApplet.load(); + + var logger = viewsManager.initIViewClass(org.argeo.slc.ria.SlcExecLoggerApplet, "main"); + logger.load(); + }, + + remove : function(viewsManager){ + viewsManager.getViewPaneById("main").empty(); + viewsManager.getViewPaneById("form").empty(); + viewsManager.getViewPanesContainer().remove(this._splitPane); + } + + } + +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/Perspective.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/Perspective.js new file mode 100644 index 000000000..21a808a86 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/Perspective.js @@ -0,0 +1,56 @@ +/** + * IPerspective Implementation : Horizontal split pane defining two panes, "list" and "applet". + */ +qx.Class.define("org.argeo.slc.web.Perspective", +{ + extend : qx.core.Object, + implement : [org.argeo.ria.components.IPerspective], + + construct : function(){ + this.base(arguments); + org.argeo.ria.util.Element.DEFAULT_NAMESPACE_MAP = {slc:"http://argeo.org/projects/slc/schemas"}; + }, + + statics : { + LABEL : "Test Results", + ICON : "resource/slc/office-chart.png" + }, + + members : { + _splitPane : null, + + initViewPanes : function(viewsManager){ + + this._splitPane = new qx.ui.splitpane.Pane("horizontal"); + var topLeft = new org.argeo.ria.components.ViewPane("list", "Collection", { + orientation : "horizontal", + min : 36 + }); + topLeft.set({width:300}); + viewsManager.registerViewPane(topLeft); + + this._splitPane.add(topLeft, 0); + var rightPane = new org.argeo.ria.components.TabbedViewPane("applet", "Test Detail"); + viewsManager.registerViewPane(rightPane); + this._splitPane.add(rightPane, 1); + + viewsManager.getViewPanesContainer().add(this._splitPane, {flex:1}); + + }, + + initViews : function(viewsManager){ + var view = viewsManager.initIViewClass(org.argeo.slc.web.TestList, "list"); + view.load(); + view.loadCollections(); + view.loadList(); + }, + + remove : function(viewsManager){ + viewsManager.getViewPaneById("list").empty(); + viewsManager.getViewPaneById("applet").empty(); + viewsManager.getViewPanesContainer().remove(this._splitPane); + } + + } + +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/TestList.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/TestList.js new file mode 100644 index 000000000..28a9f193c --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/TestList.js @@ -0,0 +1,459 @@ +/** + * Basic IView implementation for displaying the test results list, by collection. + * + * This component creates a Table object and feed it with the results. It adds a collection chooser to its viewPane header. + * + * It creates the following commands : "loadtestlist", "polllistloading", "opentest", "download", "copytocollection", "deletetest". + */ +qx.Class.define("org.argeo.slc.web.TestList", +{ + extend : qx.ui.container.Composite, + implement : [org.argeo.ria.components.IView], + + construct : function(){ + this.base(arguments, new qx.ui.layout.VBox()); + var model = new qx.ui.table.model.Simple(); + model.setColumns(["Test Case", "Date"]); + this.table = new qx.ui.table.Table(model, { + tableColumnModel: function(obj){ + return new qx.ui.table.columnmodel.Resize(obj) + } + }); + }, + + properties : + { + /** + * The viewPane containing this applet. + */ + view : { + init : null + }, + viewSelection : { + nullable:false, + check:"org.argeo.ria.components.ViewSelection" + }, + instanceId : {init:""}, + instanceLabel : {init:""}, + /** + * The load list of available collection (Map of ids => labels) + */ + collectionList : { + init : {}, + check : "Map" + }, + /** + * The current collection id selected. + */ + collectionId:{ + init : 'My Collection', + check : "String" + }, + /** + * The applet commands. + */ + commands : { + init : { + "loadtestlist" : { + label : "Load Collection", + icon : "resource/slc/view-refresh.png", + shortcut : "Control+l", + enabled : true, + menu : "Collection", + toolbar : "collection", + callback : function(e){ + this.loadList(); + }, + command : null + }, + "polllistloading" : { + label : "Auto load", + icon : "resource/slc/document-open-recent.png", + shortcut : "Control+l", + enabled : true, + toggle : true, + menu : "Collection", + toolbar : "collection", + callback : function(event){ + this.pollListLoading(event.getTarget().getUserData("slc.command.toggleState")); + }, + command : null + }, + /* + "copyfullcollection" : { + label : "Copy to...", + icon : "resource/slc/edit-copy.png", + shortcut : null, + enabled : false, + menu : "Collection", + toolbar : "collection", + callback : function(e){ + // Call service to copy + }, + submenu : {}, + submenuCallback : function(commandId){ + this.copySelectionToCollection(commandId, "current_collection"); + }, + init : function(){ + // Call at command creation + org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(event){ + if(event.getDataType() == "collection" || event.getDataType() == "test_cases"){ + var testList = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("list").getContent(); + testList.collectionListToMenu(this); + } + }, this); + }, + command : null + }, + */ + "opentest" : { + label : "Open", + icon : "resource/slc/media-playback-start.png", + shortcut : "Control+o", + enabled : false, + menu : "Selection", + toolbar : "selection", + callback : function(e){ + var viewsManager = org.argeo.ria.components.ViewsManager.getInstance(); + var classObj = org.argeo.slc.ria.Applet; + var xmlNodes = viewsManager.getViewPaneSelection("list").getNodes(); + var iView = viewsManager.initIViewClass(classObj, "applet", xmlNodes[0]); + iView.load(xmlNodes[0]); + }, + selectionChange : function(viewId, xmlNodes){ + if(viewId != "list") return; + this.setEnabled(false); + if(xmlNodes == null || !xmlNodes.length) return; + this.setEnabled(true); + }, + command : null + }, + "download" : { + label : "Download as...", + icon : "resource/slc/go-down.png", + shortcut : null, + enabled : false, + menu : "Selection", + toolbar : "selection", + callback : function(e){ }, + command : null, + submenu : [ + {'label':"Xsl", 'icon':'resource/slc/mime-xsl.png', 'commandId':'xsl'}, + {'label':"Xml", 'icon':'resource/slc/mime-xml.png', 'commandId':'xml'}, + {'label':"Excel", 'icon':'resource/slc/mime-xls.png', 'commandId':'xls'}, + {'label':"Pdf", 'icon':'resource/slc/mime-pdf.png', 'commandId':'pdf'} + ], + submenuCallback : function(commandId){ + var uuid = this.extractTestUuid(); + var urls = { + xsl : "resultView.xslt", + xml : "resultViewXml.xslt", + xls : "resultView.xls", + pdf : "resultView.pdf" + }; + var url = "../"+urls[commandId]+"?uuid="+uuid; + if(commandId == "xls" || commandId == "pdf"){ + document.location.href = url; + }else{ + var win = window.open(url); + } + }, + selectionChange : function(viewId, xmlNodes){ + if(viewId!="list")return; + //this.clearMenus(); + this.setEnabled(false); + if(xmlNodes == null || !xmlNodes.length) return; + this.setEnabled(true); + } + }, + "copytocollection" : { + label : "Copy to...", + icon : "resource/slc/edit-copy.png", + shortcut : "Control+c", + enabled : false, + menu : "Selection", + toolbar : "selection", + callback : function(e){ + // Call service to copy + }, + submenu : {}, + submenuCallback : function(commandId){ + this.copySelectionToCollection(commandId, "current_selection"); + }, + init : function(){ + // Call at command creation + org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(event){ + if(event.getDataType() == "collection" || event.getDataType() == "test_cases"){ + var testList = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("list").getContent(); + testList.collectionListToMenu(this, true); + } + }, this); + }, + selectionChange : function(viewId, xmlNodes){ + if(viewId != "list") return; + this.setEnabled(false); + if(xmlNodes == null || !xmlNodes.length) return; + this.setEnabled(true); + }, + command : null + }, + "deletetest" : { + label : "Delete", + icon : "resource/slc/edit-delete.png", + shortcut : "Control+d", + enabled : false, + menu : "Selection", + toolbar : "selection", + callback : function(e){ + var modal = new org.argeo.ria.components.Modal("Confirm", null); + modal.addConfirm("Are you sure you want to delete
test " + this.extractTestUuid() + "?"); + modal.addListener("ok", function(){ + var request = org.argeo.slc.ria.SlcApi.getRemoveResultService(this.getCollectionId(), this.extractTestUuid()); + request.addListener("completed", function(response){ + this.loadCollections(); + this.loadList(); + this.info("Test was successfully deleted"); + }, this); + request.send(); + }, this); + modal.attachAndShow(); + }, + selectionChange : function(viewId, xmlNodes){ + if(viewId != "list") return; + this.setEnabled(false); + if(xmlNodes == null || !xmlNodes.length) return; + this.setEnabled(true); + }, + command : null + } + } + } + }, + + members : { + init : function(viewPane, data){ + this.setView(viewPane); + this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId())); + }, + load : function(){ + this.table.set({ + statusBarVisible: false, + showCellFocusIndicator:false, + columnVisibilityButtonVisible:false, + contextMenu : org.argeo.ria.event.CommandsManager.getInstance().createMenuFromIds(["opentest", "download", "copytocollection", "deletetest"]), + decorator : new qx.ui.decoration.Background("#fff") + }); + var viewPane = this.getView(); + this.table.addListener("dblclick", function(e){ + org.argeo.ria.event.CommandsManager.getInstance().executeCommand("opentest"); + }, this); + var columnModel = this.table.getTableColumnModel(); + columnModel.getBehavior().setWidth(0, "60%"); + var renderer = new org.argeo.slc.web.XmlRenderer(); + columnModel.setDataCellRenderer(0, renderer); + columnModel.setDataCellRenderer(1, renderer); + + this.table.getSelectionManager().getSelectionModel().addListener("changeSelection", function(e){ + var viewSelection = this.getViewSelection(); + viewSelection.clear(); + var selectionModel = this.table.getSelectionManager().getSelectionModel(); + if(!selectionModel.getSelectedCount()){ + return; + } + var ranges = this.table.getSelectionManager().getSelectionModel().getSelectedRanges(); + var xmlNode = this.table.getTableModel().getRowData(ranges[0].minIndex); + viewSelection.addNode(xmlNode); + //viewPane.setViewSelection(viewSelection); + }, this); + + var select = new qx.ui.form.SelectBox(); + this.getView().addHeaderComponent(select); + this.getView().setViewTitle(""); + this.add(this.table, {flex:1}); + + select.addListener("changeValue", this.collectionSelectorListener, this); + + org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(event){ + if(event.getDataType()!="collection") return; + select.removeListener("changeValue", this.collectionSelectorListener, this); + var collectionList = event.getContent(); + select.removeAll(); + for(key in collectionList){ + var item = new qx.ui.form.ListItem(collectionList[key], "resource/slc/folder.png", key); + select.add(item); + if(key == this.getCollectionId()){ + select.setSelected(item); + } + } + if(qx.lang.Object.getLength(collectionList)){ + this.setCollectionId(select.getSelected().getValue()); + } + select.addListener("changeValue", this.collectionSelectorListener, this); + }, this); + + }, + + /** + * Use SlcApi to load the available collections. + */ + loadCollections : function(){ + var request = org.argeo.slc.ria.SlcApi.getListCollectionsService(); + var NSMap = {slc:"http://argeo.org/projects/slc/schemas"}; + request.addListener("completed", function(response){ + var xml = response.getContent(); + var collections = {}; + var nodes = org.argeo.ria.util.Element.selectNodes(xml, "//slc:ref", NSMap); + for(var i=0;i 1){ + // Add chooser + this.partChooser = new qx.ui.form.SelectBox(); + for(var key in this.parts){ + this.partChooser.add(new qx.ui.form.ListItem(this.parts[key].label, null, key)); + } + this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_FORM_PART_LABEL), this.partChooser); + this.partChooser.addListener("changeValue", function(ev){ + this._showSelectedPart(ev.getData()); + }, this); + } + this._showSelectedPart(qx.lang.Object.getKeys(this.parts)[0]); + }, + + /** + * Show a form part given its id. + * @param partId {String} The part id + */ + _showSelectedPart : function(partId){ + if(!this.parts) return; + if(!this.partsContainer){ + this.partsContainer = new qx.ui.container.Composite(new qx.ui.layout.Canvas()); + this.formPane.add(this.partsContainer); + } + for(var i in this.parts){ + var formObject = this.parts[i]; + if(!formObject.added){ + this.partsContainer.add(formObject.pane, {top:0, left:0}); + formObject.added = true; + } + formObject.pane.hide(); + } + if(this.parts[partId]){ + this.parts[partId].pane.show(); + } + }, + + /** + * Init a form part : creates a pane, a set of fields, etc. + * @param formId {String} A unique ID + * @param label {String} A label + * @return {Map} The form part. + */ + _initFormPart : function(formId, label){ + if(!this.parts) this.parts = {}; + var formObject = {}; + formObject.hiddenFields = {}; + formObject.freeFields = []; + formObject.fields = {}; + formObject.id = formId; + formObject.label = label; + this.parts[formId] = formObject; + formObject.pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5)); + return formObject; + }, + + /** + * To be overriden by this class children. + */ + _createFormVariableParts : function(){ + var standard = this._initFormPart("standard", "Canonical"); + this._createStandardForm(standard); + var simple = this._initFormPart("simple", "SLC Sample"); + this._createSimpleForm(simple); + }, + + /** + * Creates a form for SLC demo + * @param formObject {Map} The form part + */ + _createSimpleForm : function(formObject){ + + this._addFormInputText(formObject, "ant.file", "File", "Category1/SubCategory2/build.xml"); + var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png"); + moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter")); + moreButton.setCursor("pointer"); + moreButton.addListener("click", function(){ + this._addFormInputText(formObject); + }, this); + this._addFormHeader(formObject, "Add optionnal parameters", moreButton); + this._addFormInputText(formObject); + this._addFormInputText(formObject); + + }, + + /** + * Create a canonical form. + * @param formObject {Map} The form part + */ + _createStandardForm : function(formObject){ + + this._addFormHeader(formObject, "Set Execution Parameters"); + this._addFormInputText(formObject, "status", "Status", "STARTED"); + this._addFormInputText(formObject, "host", "Host", "localhost"); + this._addFormInputText(formObject, "user", "User", "user"); + + var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png"); + moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter")); + moreButton.setCursor("pointer"); + moreButton.addListener("click", function(){ + this._addFormInputText(formObject); + }, this); + this._addFormHeader(formObject, "Add optionnal parameters", moreButton); + this._addFormInputText(formObject); + this._addFormInputText(formObject); + }, + + /** + * Add an hidden field to the form + * @param formObject {Map} The form part + * @param fieldName {String} Name + * @param fieldValue {String} Value + */ + _addFormHiddenField : function(formObject, fieldName, fieldValue){ + formObject.hiddenFields[fieldName] = fieldValue; + }, + + /** + * Creates a simple label/input form entry. + * @param formObject {Map} The form part + * @param fieldName {String} Name + * @param fieldLabel {String} Label of the field + * @param defaultValue {String} The default value + * @param choiceValues {Map} An map of values + */ + _addFormInputText : function(formObject, fieldName, fieldLabel, defaultValue, choiceValues){ + var labelElement; + if(choiceValues){ + var fieldElement = new qx.ui.form.SelectBox(); + for(var key in choiceValues){ + fieldElement.add(new qx.ui.form.ListItem(choiceValues[key], null, key)); + } + }else{ + var fieldElement = new qx.ui.form.TextField(); + } + if(defaultValue){ + fieldElement.setValue(defaultValue); + } + if(fieldName && fieldLabel){ + labelElement = new qx.ui.basic.Label(fieldLabel); + formObject.fields[fieldName] = fieldElement; + }else{ + labelElement = new qx.ui.form.TextField(); + formObject.freeFields.push({ + labelEl:labelElement, + valueEl:fieldElement + }); + } + this._addFormEntry(formObject, labelElement, fieldElement); + }, + + /** + * Add an header + * @param formObject {Map} The form part + * @param content {Mixed} Content to add. + * @param additionnalButton {Mixed} Any widget to add on the east. + */ + _addFormHeader : function(formObject, content, additionnalButton){ + var header = new qx.ui.basic.Label(''+content+''); + header.setRich(true); + if(!additionnalButton){ + header.setPaddingTop(10); + formObject.pane.add(header); + }else{ + var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock()); + pane.setPaddingTop(10); + pane.setPaddingRight(10); + pane.add(header, {edge:'center'}); + pane.add(additionnalButton, {edge:'east'}); + formObject.pane.add(pane); + } + }, + + /** + * Adds a label/input like entry in the form. + * @param formObject {Map} The form part + * @param labelElement {Object} Either a label or an input + * @param fieldElement {Object} Any form input. + */ + _addFormEntry : function(formObject, labelElement, fieldElement){ + var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5)); + labelElement.setWidth(100); + labelElement.setTextAlign("right"); + entryPane.add(labelElement); + entryPane.add(new qx.ui.basic.Label(':')); + fieldElement.setWidth(150); + entryPane.add(fieldElement); + formObject.pane.add(entryPane); + }, + + /* + _refreshTopicsSubscriptions : function(changeTopicsEvent){ + var oldTopics = changeTopicsEvent.getOldData() || {}; + var newTopics = changeTopicsEvent.getData(); + var removed = []; + var added = []; + for(var key in oldTopics){ + if(!newTopics[key]) { + //this._removeAmqListener(key); + } + } + for(var key in newTopics){ + if(!oldTopics[key]) { + //this._addAmqListener(key); + } + } + }, + */ + + /** + * Refresh the selector when the topics are updated. + * @param changeTopicsEvent {qx.event.type.DataEvent} The reload event. + */ + _feedSelector : function(changeTopicsEvent){ + var topics = changeTopicsEvent.getData(); + this.agentSelector.removeAll(); + var emptyItem = new qx.ui.form.ListItem("", null, ""); + this.agentSelector.add(emptyItem); + this.agentSelector.setSelected(emptyItem); + for(var key in topics){ + var listItem = new qx.ui.form.ListItem(topics[key], null, key); + this.agentSelector.add(listItem); + } + }, + + /* + _addAmqListener: function(uuid){ + this._amqClient.addListener("slcExec", "topic://agent."+uuid+".newExecution", function(response){ + var message = org.argeo.ria.util.Element.selectSingleNode(response, "slc:slc-execution"); + var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid")); + slcExec.fromXml(message); + this.logModel.addRows([ + [new Date().toString(), slcExec.getHost()+' ('+slcExec.getUuid()+')', slcExec.getStatus()] + ]); + }, this); + }, + + _removeAmqListener : function(uuid){ + this._amqClient.removeListener("slcExec", "topic://agent."+uuid+".newExecution"); + }, + */ + + /** + * Make an SlcExecutionMessage from the currently displayed form. + * @param crtPartId {String} The form part currently displayed + * @param slcExec {org.argeo.slc.ria.SlcExecutionMessage} The message to fill. + * @param fields {Map} The fields of the form + * @param hiddenFields {Map} The hidden ones + * @param freeFields {Array} The free fields. + */ + _prepareSlcExecutionMessage : function(crtPartId, slcExec, fields, hiddenFields, freeFields){ + if(crtPartId == "standard"){ + slcExec.setStatus(fields.status.getValue()); + slcExec.setHost(fields.host.getValue()); + slcExec.setUser(fields.user.getValue()); + }else{ + slcExec.addAttribute("ant.file", fields["ant.file"].getValue()); + } + for(var i=0;i the selected test" + (sel.length>1?"s":"") + " from the Batch?"); + modal.addListener("ok", function(){ + for(var i=0;i 0)) this.setEnabled(true); + }, + command : null + }, + "reloadagents" : { + label : "Reload Agents", + icon : "resource/slc/view-refresh.png", + shortcut : "Control+r", + enabled : true, + menu : "Launcher", + toolbar : "launcher", + callback : function(e){ + var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents"); + req.send(); + }, + command : null + }, + "reloadtree" : { + label : "Reload", + icon : "resource/slc/view-refresh.png", + shortcut : "Control+m", + enabled : false, + menu : "Launcher", + toolbar : "launcher", + callback : function(e){ + var selected = this.tree.getSelectedItem(); + if(selected.classname == "org.argeo.ria.components.DynamicTreeFolder"){ + if(selected.getUserData("moduleData")){ + // It's a "module" node, first trigger the reloadBundle.service + selected.setUserData("dataModel", {}); + selected.setEnabled(false); + selected.setOpen(false); + var moduleData = selected.getUserData("moduleData"); + var bundleService = org.argeo.slc.ria.SlcApi.getReloadBundleService(moduleData.name, moduleData.version); + bundleService.addListener("completed", function(response){ + selected.setEnabled(true); + selected.setOpen(true); + selected.reload(); + }, this); + //bundleService.send(); + //Do not send, not implemented yet, false timer instead. + qx.event.Timer.once(function(response){ + selected.setEnabled(true); + selected.setOpen(true); + selected.reload(); + }, this, 2000); + }else{ + selected.reload(); + } + } + }, + selectionChange : function(viewId, selection){ + if(viewId != "form:tree") return; + if(!selection || selection.length != 1) return; + var item = selection[0]; + if(!qx.Class.isSubClassOf(qx.Class.getByName(item.classname), qx.ui.tree.AbstractTreeItem)) return; + this.setEnabled(false); + if(qx.Class.isSubClassOf(qx.Class.getByName(item.classname), org.argeo.ria.components.DynamicTreeFolder)){ + this.setEnabled(true); + } + }, + command : null + } + } + }, + /** + * A map containing all currently registered agents. + */ + registeredTopics : { + init : {}, + check : "Map", + event : "changeRegisteredTopics" + } + }, + + statics : { + /** + * Loader for the "flow" level : takes a folder containing "moduleData" and create its children. + * @param folder {qx.ui.tree.TreeFolder} A Tree folder containing in the key "moduleData" of its user data a map containing the keys {name,version} + */ + flowLoader : function(folder){ + var moduleData = folder.getUserData("moduleData"); + //var pathStub = ["", "/test/toto/zobi", "loop"]; + //var indexStub = 0; + + var req = org.argeo.slc.ria.SlcApi.getLoadExecutionDescriptorService(moduleData.name, moduleData.version); + req.addListener("completed", function(response){ + var executionModule = new org.argeo.slc.ria.execution.Module(); + executionModule.setXmlNode(response.getContent()); + var execFlows = executionModule.getExecutionFlows(); + for(var key in execFlows){ + var file = new qx.ui.tree.TreeFile(key); + var path = execFlows[key].getPath(); + //path = pathStub[indexStub]; + //indexStub ++; + file.setUserData("executionModule", executionModule); + file.setUserData("executionFlow", execFlows[key]); + org.argeo.slc.ria.NewLauncherApplet.attachNodeByPath(folder, path, file); + folder.appendDragData(file); + } + folder.setLoaded(true); + }); + req.send(); + }, + + /** + * Loader for the "modules" level : takes any tree folder, currently the root folder. + * @param folder {qx.ui.tree.TreeFolder} The root folder + */ + modulesLoader : function(folder){ + var req = org.argeo.slc.ria.SlcApi.getListModulesService(); + req.addListener("completed", function(response){ + var descriptors = org.argeo.ria.util.Element.selectNodes(response.getContent(), "slc:object-list/slc:execution-module-descriptor"); + var mods = {}; + for(var i=0;i'); + builder.add(''+this.getStatus()+''); + builder.add(''+this.getType()+''); + builder.add(''+this.getHost()+''); + builder.add(''+this.getUser()+''); + var attr = this.getAttributes(); + if(qx.lang.Object.getLength(attr)){ + builder.add(''); + for(var key in attr){ + builder.add(''+attr[key]+''); + } + builder.add(''); + } + builder.add(''); + return builder.get(); + }, + + /** + * Parse an XML answer and fill the object with it. + * @param slcExecXml {String} An slcExecMessage mapped in XML. + */ + fromXml : function(slcExecXml){ + var NSMap = {slc:"http://argeo.org/projects/slc/schemas"}; + this.setStatus(org.argeo.ria.util.Element.getSingleNodeText(slcExecXml, "slc:status", NSMap)); + this.setType(org.argeo.ria.util.Element.getSingleNodeText(slcExecXml, "slc:type", NSMap)); + this.setHost(org.argeo.ria.util.Element.getSingleNodeText(slcExecXml, "slc:host", NSMap)); + this.setUser(org.argeo.ria.util.Element.getSingleNodeText(slcExecXml, "slc:user", NSMap)); + var attributes = org.argeo.ria.util.Element.selectNodes(slcExecXml, "slc:attribute", NSMap); + for(var i=0;i'+valuesXml+''; + + var execSpecDescXML = this.getOriginalSpec().toXml(); + + var moduleData = ''+this.getModule().getName()+''+this.getModule().getVersion()+''; + + return ''+moduleData + execFlowDescXML + execSpecDescXML +''; + + }, + + /** + * Fetch the Spec Values with the Flow Values to make the current instance value + */ + fetchInstanceValues : function(){ + var specValues = this.getOriginalSpec().getValues(); + var flow = this.getFlow(); + var instanceValues = {}; + for(var key in specValues){ + var flowValue = flow.getValue( + key, + specValues[key].getSpecType(), + specValues[key].getSpecSubType() + ); + var instValue = specValues[key].clone(); + if(flowValue){ + instValue.setValue(flowValue); + } + instanceValues[key] = instValue; + } + this.setValues(instanceValues); + //this.debug(instanceValues); + } + } +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Flow.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Flow.js new file mode 100644 index 000000000..017599ee6 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Flow.js @@ -0,0 +1,104 @@ +/** + * Wrapper for ExecutionFlow server object + */ +qx.Class.define("org.argeo.slc.ria.execution.Flow", { + + extend : qx.core.Object, + + properties : { + /** + * Name of this Execution Flow + */ + name : { + check : "String", + init : "" + }, + /** + * An optional path describing this flow + */ + path : { + check : "String", + nullable : true + }, + /** + * Name of the associated spec, to be found in the module + */ + executionSpecName : { + check : "String" + }, + /** + * Reference the actual ExecutionSpec object + */ + executionSpec : { + check : "org.argeo.slc.ria.execution.Spec" + }, + /** + * The values to init the ExecutionSpec + */ + values : { + check : "Node" + }, + /** + * Castor representation of the object + */ + xmlNode : { + apply : "_applyXmlNode" + } + }, + + statics : { + /** + * Xpath to the name + */ + XPATH_NAME : "@name", + /** + * XPath to the ExecutionSpec name + */ + XPATH_EXEC_SPEC_NAME : "@executionSpec", + /** + * XPath to the values + */ + XPATH_VALUES : "slc:values", + /** + * An optional hierarchical path + */ + XPATH_PATH : "@path" + }, + + construct : function(){ + this.base(arguments); + }, + + members : { + /** + * Init the object from an XML representation + * @param xmlNode {Node} Castor representation of this object + */ + _applyXmlNode : function(xmlNode){ + this.set({ + name : org.argeo.ria.util.Element.getSingleNodeText(xmlNode, this.self(arguments).XPATH_NAME), + path : org.argeo.ria.util.Element.getSingleNodeText(xmlNode, this.self(arguments).XPATH_PATH), + executionSpecName : org.argeo.ria.util.Element.getSingleNodeText(xmlNode, this.self(arguments).XPATH_EXEC_SPEC_NAME) + }); + var values = org.argeo.ria.util.Element.selectNodes(xmlNode, this.self(arguments).XPATH_VALUES); + this.setValues(values[0]); + }, + /** + * Get a given value inside the values map + * @param key {String} The key of the value + * @param specType {String} Expected type (currently "primitive" and "ref" are supported) + * @param specSubType {String} Expected subtype (depends on the type) + * @return {String} Value if it is set. + */ + getValue: function(key, specType, specSubType){ + var xpath; + if(specType == "primitive"){ + xpath = 'slc:value[@key="'+key+'"]/slc:primitive-value[@type="'+specSubType+'"]'; + }else if(specType == "ref"){ + xpath = 'slc:value[@key="'+key+'"]/slc:ref-value/slc:label'; + } + return org.argeo.ria.util.Element.getSingleNodeText(this.getValues(), xpath); + } + } + +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Message.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Message.js new file mode 100644 index 000000000..0140311db --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Message.js @@ -0,0 +1,148 @@ +/** + * A generic JMS slcExecution message encapsulator. + */ +qx.Class.define("org.argeo.slc.ria.execution.Message", { + extend : qx.core.Object, + /** + * New instance + * @param uuid {String} The Uuid of the message. If none is passed, one is generated. + */ + construct : function(uuid){ + this.base(arguments); + if(uuid){ + this.setUuid(uuid); + }else{ + var s = []; + var itoh = '0123456789ABCDEF'; + for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10); + s[14] = 4; // Set 4 high bits of time_high field to version + s[19] = (s[19] & 0x3) | 0x8; // Specify 2 high bits of clock sequence + for (var i = 0; i <36; i++) s[i] = itoh[s[i]]; + s[8] = s[13] = s[18] = s[23] = '-'; + this.setUuid(s.join('').toLowerCase()); + } + this.setBatchEntrySpecs([]); + this.setAttributes({}); + }, + properties : { + /** + * The unique id identifying the message + */ + uuid : { + check : "String" + }, + /** + * Execution status + */ + status : { + check : "String", + init : "STARTED" + }, + /** + * Execution type + */ + type : { + check : "String", + init : "slcAnt" + }, + /** + * Execution Host + */ + host : { + check : "String", + init : "localhost" + }, + /** + * Execution User + */ + user : { + check : "String", + init : "user" + }, + /** + * Date of the message. now() by default. + */ + date : { + check : "String", + init : new Date().toString() + }, + /** + * Additionnal attributes as map of key/values + */ + attributes : { + check : "Map" + }, + batchEntrySpecs : { + check : "Array" + } + }, + members : { + + /** + * Add a free attribute to the message + * @param attName {String} Name + * @param attValue {String} Value + */ + addAttribute: function(attName, attValue){ + var attr = this.getAttributes(); + attr[attName] = attValue; + this.setAttributes(attr); + }, + + addBatchEntrySpec : function(entrySpec){ + this.getBatchEntrySpecs().push(entrySpec); + }, + + /** + * Build the xml formatted message body to send + * + * @return {String} The message content as Xml + */ + toXml : function (){ + var builder = new qx.util.StringBuilder(); + builder.add(''); + builder.add(''+this.getStatus()+''); + builder.add(''+this.getType()+''); + builder.add(''+this.getHost()+''); + builder.add(''+this.getUser()+''); + var flows = this.getBatchEntrySpecs(); + if(flows.length){ + builder.add(''); + for(var i=0;i'); + } + var attr = this.getAttributes(); + if(qx.lang.Object.getLength(attr)){ + builder.add(''); + for(var key in attr){ + builder.add(''+attr[key]+''); + } + builder.add(''); + } + builder.add(''); + return builder.get(); + }, + + /** + * Parse an XML answer and fill the object with it. + * @param slcExecXml {String} An slcExecMessage mapped in XML. + */ + fromXml : function(slcExecXml){ + var NSMap = {slc:"http://argeo.org/projects/slc/schemas"}; + this.setStatus(org.argeo.ria.util.Element.getSingleNodeText(slcExecXml, "slc:status", NSMap)); + this.setType(org.argeo.ria.util.Element.getSingleNodeText(slcExecXml, "slc:type", NSMap)); + this.setHost(org.argeo.ria.util.Element.getSingleNodeText(slcExecXml, "slc:host", NSMap)); + this.setUser(org.argeo.ria.util.Element.getSingleNodeText(slcExecXml, "slc:user", NSMap)); + var attributes = org.argeo.ria.util.Element.selectNodes(slcExecXml, "slc:attribute", NSMap); + for(var i=0;i'+valuesXml+''; + } + } + +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/SpecEditor.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/SpecEditor.js new file mode 100644 index 000000000..6d8683989 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/SpecEditor.js @@ -0,0 +1,254 @@ +/** + * Generic modal popup window. + * It is layed out with a dock layout. When adding components to it, they are added as "center". + * @author Charles du Jeu + */ +qx.Class.define("org.argeo.slc.ria.execution.SpecEditor", +{ + extend : qx.ui.window.Window, + + properties : { + /** + * The Spec to edit + */ + batchEntrySpec : { + check : "org.argeo.slc.ria.execution.BatchEntrySpec" + } + }, + + events : { + /** + * Triggered when the user clicks the "save" button. + */ + "save" : "qx.event.type.Event", + /** + * Triggered when any data is modified + */ + "modified" : "qx.event.type.Event" + + }, + /** + * Opens an editor with the given values. + * @param batchEntrySpec {org.argeo.slc.ria.execution.BatchEntrySpec} The initial spec to edit + */ + construct : function(batchEntrySpec){ + var editorLabel = "Edit Specs for "+batchEntrySpec.getLabel(); + this.base(arguments, editorLabel); + this.set({ + batchEntrySpec : batchEntrySpec, + showMaximize : false, + showMinimize : false, + width: Math.min(parseInt(qx.bom.Viewport.getWidth()*90/100), 400), + height: parseInt(qx.bom.Viewport.getHeight()*60/100) + }); + this.setLayout(new qx.ui.layout.Dock()); + this.setModal(true); + this.center(); + this._initFormObject(this.getBatchEntrySpec().getLabel()); + this._addFormHeader(this.formObject, editorLabel); + this.createFormFromSpec(); + this.addContent(this.formObject.pane); + this.addOkCancel(); + this.addListener("save", function(e){ + this.saveFormToSpec(); + }, this); + }, + + members : { + /** + * Builds the form from the BatchEntrySpec + */ + createFormFromSpec : function(){ + var values = this.getBatchEntrySpec().getValues(); + for(var key in values){ + var valueObj = values[key]; + var label = key; + var hidden = valueObj.getHidden(); + var disabled = valueObj.getFrozen(); + var value = valueObj.getValue(); + var type = valueObj.getSpecType(); + var subType = valueObj.getSpecSubType(); + if(type == "primitive" && !hidden){ + this._addFormInputText(this.formObject, key, key, value, disabled, subType); + } + } + }, + /** + * Gather data from the form + */ + saveFormToSpec : function(){ + var values = this.getBatchEntrySpec().getValues(); + for(var key in values){ + var valueObj = values[key]; + var hidden = valueObj.getHidden(); + var disabled = valueObj.getFrozen(); + if(valueObj.getSpecType() == "primitive"){ + if(!hidden && !disabled){ + valueObj.setValue(this.formObject.fields[key].getValue()); + } + } + } + }, + + /** + * Display a component (panel) in the center of the popup + * @param panel {qx.ui.core.Widget} A gui component (will be set at width 100%). + */ + addContent: function(panel){ + this.add(new qx.ui.container.Scroll(panel), {edge:'center', width:'100%'}); + }, + /** + * Automatically attach to the application root, then show. + */ + attachAndShow:function(){ + org.argeo.ria.components.ViewsManager.getInstance().getApplicationRoot().add(this); + this.show(); + }, + /** + * Init a form part : creates a pane, a set of fields, etc. + * @param label {String} A label + * @return {Map} The form part. + */ + _initFormObject : function(label){ + this.formObject = {}; + this.formObject.hiddenFields = {}; + this.formObject.freeFields = []; + this.formObject.fields = {}; + this.formObject.label = label; + this.formObject.pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5)); + return this.formObject; + }, + + /** + * Creates a simple label/input form entry. + * @param formObject {Map} The form part + * @param fieldName {String} Name + * @param fieldLabel {String} Label of the field + * @param defaultValue {String} The default value + * @param choiceValues {Map} An map of values + * @param disabled {Boolean} The field is not writable + * @param subType {String} The type expected (string, integer, etc). + */ + _addFormInputText : function(formObject, fieldName, fieldLabel, defaultValue, disabled, subType, choiceValues){ + var labelElement; + if(choiceValues){ + var fieldElement = new qx.ui.form.SelectBox(); + for(var key in choiceValues){ + fieldElement.add(new qx.ui.form.ListItem(choiceValues[key], null, key)); + } + fieldElement.addListener("changeSelected", function(e){this.fireEvent("modified")}, this); + }else{ + var fieldElement = new qx.ui.form.TextField(); + if(subType == "integer"){ + fieldElement.addListener("changeValue", function(e){ + var isNum = !isNaN(e.getData() * 1); + if(!isNum){ + alert("Warning, this field only accepts Integers!"); + } + }, this); + } + fieldElement.addListener("input", function(e){this.fireEvent("modified")}, this); + } + if(defaultValue){ + fieldElement.setValue(defaultValue); + } + if(fieldName && fieldLabel){ + labelElement = new qx.ui.basic.Label(fieldLabel); + formObject.fields[fieldName] = fieldElement; + }else{ + labelElement = new qx.ui.form.TextField(); + formObject.freeFields.push({ + labelEl:labelElement, + valueEl:fieldElement + }); + } + if(disabled) fieldElement.setEnabled(false); + this._addFormEntry(formObject, labelElement, fieldElement); + }, + + /** + * Add an header + * @param formObject {Map} The form part + * @param content {Mixed} Content to add. + * @param additionnalButton {Mixed} Any widget to add on the east. + */ + _addFormHeader : function(formObject, content, additionnalButton){ + var header = new qx.ui.basic.Label(''+content+''); + header.setRich(true); + if(!additionnalButton){ + header.setPaddingBottom(10); + formObject.pane.add(header); + }else{ + var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock()); + pane.setPaddingBottom(10); + pane.setPaddingRight(10); + pane.add(header, {edge:'center'}); + pane.add(additionnalButton, {edge:'east'}); + formObject.pane.add(pane); + } + }, + + /** + * Adds a label/input like entry in the form. + * @param formObject {Map} The form part + * @param labelElement {Object} Either a label or an input + * @param fieldElement {Object} Any form input. + */ + _addFormEntry : function(formObject, labelElement, fieldElement){ + var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5)); + labelElement.setWidth(150); + labelElement.setTextAlign("right"); + entryPane.add(labelElement); + entryPane.add(new qx.ui.basic.Label(':')); + fieldElement.setWidth(150); + entryPane.add(fieldElement); + formObject.pane.add(entryPane); + }, + + /** + * Adds a close button bottom-center aligned to the popup + */ + addCloseButton : function(){ + this.closeButton = new qx.ui.form.Button("Close"); + this.closeButton.addListener("execute", this._closeAndDestroy, this); + this.add(this.closeButton, {edge:'south'}); + }, + /** + * Adds two buttons bottom-center aligned (Ok and Cancel). + * Ok button has no listener by default, Cancel will close and destroy the popup. + */ + addOkCancel : function(){ + var buttonPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5, 'right')); + buttonPane.setAlignX("center"); + this.add(buttonPane, {edge:"south"}); + this.okButton = new qx.ui.form.Button("Save"); + this.okButton.setEnabled(false); + this.addListener("modified", function(e){ + this.okButton.setEnabled(true); + }, this); + this.okButton.addListener("execute", function(e){ + this.fireEvent("save"); + this.okButton.setEnabled(false); + }, this); + this.cancelButton = new qx.ui.form.Button("Close"); + this.cancelButton.addListener("execute", this._closeAndDestroy, this); + + this.saveCloseButton = new qx.ui.form.Button("Save & Close"); + this.saveCloseButton.addListener("execute", function(e){ + this.fireEvent("save"); + this._closeAndDestroy(); + }, this); + + buttonPane.add(this.okButton); + buttonPane.add(this.cancelButton); + buttonPane.add(this.saveCloseButton); + }, + /** + * Close this modal window and destroy it. + */ + _closeAndDestroy : function(){ + this.hide(); + this.destroy(); + } + } +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Value.js b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Value.js new file mode 100644 index 000000000..b5944a019 --- /dev/null +++ b/server/org.argeo.slc.ria/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Value.js @@ -0,0 +1,129 @@ +/** + * Wrapper for SlcValue object + */ +qx.Class.define("org.argeo.slc.ria.execution.Value", { + + extend : qx.core.Object, + + properties : { + /** + * Name of this Execution Flow + */ + key : { + check : "String", + init : "" + }, + /** + * The type of this value, for the moment "primitive" and "ref" are supported + */ + specType : { + check : "String", + init : "" + }, + /** + * Subtype, depending on the "type". + */ + specSubType : { + check : "String" + }, + /** + * Whether it is a parameter or not + */ + parameter : { + check : "Boolean" + }, + /** + * Whether it is frozen on the server, i.e. disabled in the form + */ + frozen : { + check : "Boolean" + }, + /** + * Should not be editable nor seeable, thus hidden + */ + hidden : { + check : "Boolean" + }, + /** + * The real value + */ + value : { + nullable : true + }, + /** + * Castor representation of the object + */ + xmlSpecNode : { + apply : "_applyXmlSpecNode" + } + }, + + statics : { + XPATH_KEY : "@key" + }, + + construct : function(){ + this.base(arguments); + }, + + members : { + /** + * Init the object from an XML representation + * @param xmlNode {Node} Castor representation of this object + */ + _applyXmlSpecNode : function(xmlNode){ + this.setKey(org.argeo.ria.util.Element.getSingleNodeText(xmlNode, "@key")); + var childs = xmlNode.childNodes; + for(var i=0;i